SQL DUAS TABELAS E REPETIR CAMPOS
Tenho a seguinte situação e não sei como montar a consulta SQL (SQL Server 2008 R2)
Meu sistema terá 3 idiomas (Português = PT, Inglês = EN e Espanhol = ES). Se o cliente quiser, poderá cadastrar certas informações nestes 3 idiomas, não obrigatoriamente.
Nesse cenário tenho as duas tabelas abaixo relacionadas:
ATITUDES
ID
INATIVO
ATITUDES_IDIOMA
IDAtitude
Atitude
Idioma
Assim posso ter a seguinte situação em ATITUDES_IDIOMA:
Só 1 idioma cadastrado
1 - Proatividade - PT
2 - Pontualidade - PT
3 - Comprometimento - PT
etc...
2 idiomas ou mais idiomas cadastrados[/b}
1 - Proatividade - PT
1 - Proactivity - EN
2 - Pontualidade - PT
2 - Punctuality - EN
3 - Comprometimento - PT
3 - Commitment - EN
Em um cadastro de Cargo, se for [b]INCLUIR um registro terei de pegar os dados auxiliares dessa tabela (ATITUDES_IDIOMA) para colocar em um DataGridView com as seguintes estrutura, sendo o campo Valor sempre = 0 por ser inclusão.
ID - Atitude PT - Atitude EN - Atitude ES - Valor
1 - Pergunta: Como montar a SQL para receber os dados de modo que possa associar no DataGrid, sendo que os idiomas estão na mesma tabela? E se existir um único idioma, que os demais venham em branco?
Já se for ALTERAR o cadastro desse Cargo, pego os dados acima gravados em outra tabela (abaixo) que estará relacionada a ATITUDES_IDIOMA para pegar os textos no idioma correto:
CARGO_ATITUDE
IDCargo
IDAtitude
Valor
2 - Pergunta: Como ficaria o Select nesse outro caso para preencher o mesmo grid, sendo que agora eu já tenho o valor de cada Atitude?
Meu sistema terá 3 idiomas (Português = PT, Inglês = EN e Espanhol = ES). Se o cliente quiser, poderá cadastrar certas informações nestes 3 idiomas, não obrigatoriamente.
Nesse cenário tenho as duas tabelas abaixo relacionadas:
ATITUDES
ID
INATIVO
ATITUDES_IDIOMA
IDAtitude
Atitude
Idioma
Assim posso ter a seguinte situação em ATITUDES_IDIOMA:
Só 1 idioma cadastrado
1 - Proatividade - PT
2 - Pontualidade - PT
3 - Comprometimento - PT
etc...
2 idiomas ou mais idiomas cadastrados[/b}
1 - Proatividade - PT
1 - Proactivity - EN
2 - Pontualidade - PT
2 - Punctuality - EN
3 - Comprometimento - PT
3 - Commitment - EN
Em um cadastro de Cargo, se for [b]INCLUIR um registro terei de pegar os dados auxiliares dessa tabela (ATITUDES_IDIOMA) para colocar em um DataGridView com as seguintes estrutura, sendo o campo Valor sempre = 0 por ser inclusão.
ID - Atitude PT - Atitude EN - Atitude ES - Valor
1 - Pergunta: Como montar a SQL para receber os dados de modo que possa associar no DataGrid, sendo que os idiomas estão na mesma tabela? E se existir um único idioma, que os demais venham em branco?
Já se for ALTERAR o cadastro desse Cargo, pego os dados acima gravados em outra tabela (abaixo) que estará relacionada a ATITUDES_IDIOMA para pegar os textos no idioma correto:
CARGO_ATITUDE
IDCargo
IDAtitude
Valor
2 - Pergunta: Como ficaria o Select nesse outro caso para preencher o mesmo grid, sendo que agora eu já tenho o valor de cada Atitude?
Ontem pesquisei isso e não achei, hoje após postar a dúvida encontrei uma solução, mas estou com um pequeno problema:
O código acima funciona, mas ao invés de trazer os dados assim
Português - Inglês e Espanhol
está trazendo assim, mesmo o select estando na ordem correta:
Inglês - Português - Espanhol
Tem como corrigir isso, pois terei de associar os dados ao grid e a ordem das colunas é fundamental para não embaralhar os dados depois.
SELECT ATITUDE_IDIOMA.IDATITUDE, ATITUDE_IDIOMA.ATITUDE FROM ATITUDE_IDIOMA WHERE ATITUDE_IDIOMA.IDIOMA =[ô]PT[ô] UNION SELECT ATITUDE_IDIOMA.IDATITUDE, ATITUDE_IDIOMA.ATITUDE FROM ATITUDE_IDIOMA WHERE ATITUDE_IDIOMA.IDIOMA =[ô]EN[ô] UNION SELECT ATITUDE_IDIOMA.IDATITUDE, ATITUDE_IDIOMA.ATITUDE FROM ATITUDE_IDIOMA WHERE ATITUDE_IDIOMA.IDIOMA =[ô]ES[ô];
O código acima funciona, mas ao invés de trazer os dados assim
Português - Inglês e Espanhol
está trazendo assim, mesmo o select estando na ordem correta:
Inglês - Português - Espanhol
Tem como corrigir isso, pois terei de associar os dados ao grid e a ordem das colunas é fundamental para não embaralhar os dados depois.
Luis,
Para o primeiro caso, é fazer 3 subquerys. Ficaria mais ou menos assim:
Para o segundo caso é só filtrar para o id. Ficaria mais ou menos assim:
Qualquer dúvida entre em contato.
Para o primeiro caso, é fazer 3 subquerys. Ficaria mais ou menos assim:
SELECT id,
(SELECT atitude FROM atitudes_idioma WHERE (id = a.id) AND (idioma = [ô]PT[ô])) AS pt,
(SELECT atitude FROM atitudes_idioma WHERE (id = a.id) AND (idioma = [ô]EN[ô])) AS en,
(SELECT atitude FROM atitudes_idioma WHERE (id = a.id) AND (idioma = [ô]ES[ô])) AS es
FROM atitudes a
WHERE (inativo = false);
Para o segundo caso é só filtrar para o id. Ficaria mais ou menos assim:
SELECT id,
(SELECT atitude FROM atitudes_idioma WHERE (id = a.id) AND (idioma = [ô]PT[ô])) AS pt,
(SELECT atitude FROM atitudes_idioma WHERE (id = a.id) AND (idioma = [ô]EN[ô])) AS en,
(SELECT atitude FROM atitudes_idioma WHERE (id = a.id) AND (idioma = [ô]ES[ô])) AS es
FROM atitudes a
WHERE (id = @seudi);
Qualquer dúvida entre em contato.
Luis,
O seu select não vai trazer os dados numa única coluna e sim em três linhas, pois a função do Union é unir as tabelas com campos em comum.
O seu select não vai trazer os dados numa única coluna e sim em três linhas, pois a função do Union é unir as tabelas com campos em comum.
Fabiano O SELECT 1 ficou fantástico, mas só um detalhe. Veja na imagem que o resultado trás os dados corretos, mas várias linhas abaixo com todos os campos = null. Estes campos acredito que seja porque a tabela tem 14 registros, onde cada idioma da mesma atitude fica numa linha.
Tem como nessa Select eliminar as linhas onde todos os campos sejam NULL? Ou isso só via código no aplicativo?
Já no SELECT 2 consegui ajustar, comecei a entender um pouco mais.
SELECT ID,
(SELECT ATITUDE FROM ATITUDE_IDIOMA WHERE (IDATITUDE = a.ID) AND (IDIOMA = [ô]PT[ô])) AS ATITUDE_PT,
(SELECT ATITUDE FROM ATITUDE_IDIOMA WHERE (IDATITUDE = a.ID) AND (IDIOMA = [ô]EN[ô])) AS ATITUDE_EN,
(SELECT ATITUDE FROM ATITUDE_IDIOMA WHERE (IDATITUDE = a.ID) AND (IDIOMA = [ô]ES[ô])) AS ATITUDE_ES,
(SELECT VALOR FROM CARGOATITUDES WHERE ((IDATITUDE = a.ID) AND (IDCARGO = 1)))
FROM ATITUDES a
WHERE ((INATIVO = 0));
Só ficou também com as linhas Null ao final igual ao outro.
Estou no Skype se puder entrar.... posso explicar melhor se precisar.
Tem como nessa Select eliminar as linhas onde todos os campos sejam NULL? Ou isso só via código no aplicativo?
Já no SELECT 2 consegui ajustar, comecei a entender um pouco mais.
SELECT ID,
(SELECT ATITUDE FROM ATITUDE_IDIOMA WHERE (IDATITUDE = a.ID) AND (IDIOMA = [ô]PT[ô])) AS ATITUDE_PT,
(SELECT ATITUDE FROM ATITUDE_IDIOMA WHERE (IDATITUDE = a.ID) AND (IDIOMA = [ô]EN[ô])) AS ATITUDE_EN,
(SELECT ATITUDE FROM ATITUDE_IDIOMA WHERE (IDATITUDE = a.ID) AND (IDIOMA = [ô]ES[ô])) AS ATITUDE_ES,
(SELECT VALOR FROM CARGOATITUDES WHERE ((IDATITUDE = a.ID) AND (IDCARGO = 1)))
FROM ATITUDES a
WHERE ((INATIVO = 0));
Só ficou também com as linhas Null ao final igual ao outro.
Estou no Skype se puder entrar.... posso explicar melhor se precisar.
dê uma olhada sobre CTE (Common-Table-Expressions) CTE
talvez possa ajudar
só acrecentar IS NOT NULL depois do where
talvez possa ajudar
só acrecentar IS NOT NULL depois do where
Fellipe não entendi. Onde incluir isso, pois há 5 Where nessa string?
Não pode ser nos 3 primeiros, pois eles podem ser nulos intercalados, só não podem ser os 3 campos simultaneamente. No 4 where do Valor não tem relação, então tentei incluir no último WHERE, mas dá erro dizendo sintaxe errada após IS.
Nota: Pela imagem do post acima, teria de eliminar as linhas 7 até 13.
Não pode ser nos 3 primeiros, pois eles podem ser nulos intercalados, só não podem ser os 3 campos simultaneamente. No 4 where do Valor não tem relação, então tentei incluir no último WHERE, mas dá erro dizendo sintaxe errada após IS.
SELECT ID,
(SELECT ATITUDE FROM ATITUDE_IDIOMA WHERE (IDATITUDE = a.ID) AND (IDIOMA = [ô]PT[ô])) AS ATITUDE_PT,
(SELECT ATITUDE FROM ATITUDE_IDIOMA WHERE (IDATITUDE = a.ID) AND (IDIOMA = [ô]EN[ô])) AS ATITUDE_EN,
(SELECT ATITUDE FROM ATITUDE_IDIOMA WHERE (IDATITUDE = a.ID) AND (IDIOMA = [ô]ES[ô])) AS ATITUDE_ES,
(SELECT VALOR FROM CARGOATITUDES WHERE ((IDATITUDE = a.ID) AND (IDCARGO = 1)))
FROM ATITUDES a
WHERE ((INATIVO = 0));
Nota: Pela imagem do post acima, teria de eliminar as linhas 7 até 13.
Bem fiz a eliminação das linhas no código do app mesmo.
FFCouto muito obrigado, ficou show.
FFCouto muito obrigado, ficou show.
Tópico encerrado , respostas não são mais permitidas