SQL DUAS TABELAS E REPETIR CAMPOS

LUIS.HERRERA 10/05/2013 09:39:56
#423240
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?
LUIS.HERRERA 10/05/2013 10:04:26
#423244
Ontem pesquisei isso e não achei, hoje após postar a dúvida encontrei uma solução, mas estou com um pequeno problema:

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.
FFCOUTO 10/05/2013 10:15:56
#423248
Resposta escolhida
Luis,

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.
FFCOUTO 10/05/2013 10:41:58
#423254
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.
LUIS.HERRERA 10/05/2013 10:55:01
#423257
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.
FELLIPEASSIS 10/05/2013 13:33:50
#423282
dê uma olhada sobre CTE (Common-Table-Expressions) CTE
talvez possa ajudar
só acrecentar IS NOT NULL depois do where
LUIS.HERRERA 10/05/2013 13:45:04
#423283
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.

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.
LUIS.HERRERA 10/05/2013 15:32:16
#423300
Bem fiz a eliminação das linhas no código do app mesmo.

FFCouto muito obrigado, ficou show.
Tópico encerrado , respostas não são mais permitidas