Distinct com inner join não funciona
11/02/2020
0
Estou tentando fazer um distinct no campo sigla da variavel e não consigo. Segue a query:
SELECT V.sigla,A.codAtividade, A.mesInicioAtividade, A.anoInicioAtividade, A.nome, T.codTema, T.mesInicioTema, T.anoInicioTema, T.nome, I.codIndicador, I.mesInicioIndicador, I.anoInicioIndicador, I.sigla, I.nome, I.formula,
V.codVariavel, V.mesInicioVariavel, V.anoInicioVariavel, V.nome , UM.sigla, V.periodicidade
FROM atividade A
INNER JOIN atividadeDoTema ADT
ON A.codAtividade = ADT.codAtividade
AND A.mesInicioAtividade = ADT.mesInicioAtividade
AND A.anoInicioAtividade = ADT.anoInicioAtividade
AND ADT.dataRemocao IS NULL
INNER JOIN tema T
ON T.codtema = ADT.codTema
AND T.mesInicioTema = ADT.mesInicioTema
AND T.anoInicioTema = ADT.anoInicioTema
AND T.dataRemocao IS NULL
INNER JOIN indicadorDoTema IDT
ON T.codtema = IDT.codTema
AND T.mesInicioTema = IDT.mesInicioTema
AND T.anoInicioTema = IDT.anoInicioTema
AND IDT.dataRemocao IS NULL
INNER JOIN indicador I
ON I.codIndicador = IDT.codIndicador
AND I.mesInicioIndicador = IDT.mesInicioIndicador
AND I.anoInicioIndicador = IDT.anoInicioIndicador
AND I.dataRemocao IS NULL
INNER JOIN indicadorDaVariavel IDV
ON I.codIndicador = IDV.codIndicador
AND I.mesInicioIndicador = IDV.mesInicioIndicador
AND I.anoInicioIndicador = IDV.anoInicioIndicador
AND IDV.dataRemocao IS NULL
INNER JOIN variavel V
ON V.codVariavel = IDV.codVariavel
AND V.mesInicioVariavel = IDV.mesInicioVariavel
AND V.anoInicioVariavel = IDV.anoInicioVariavel
AND V.dataRemocao IS NULL
INNER JOIN UnidadeMedida UM
ON V.codUnidadeMedida = UM.codUnidadeMedida
WHERE A.codAtividade = 2 AND T.codTema = 9 AND V.sigla in (SELECT DISTINCT V.sigla from Variavel)
ORDER BY A.nome, T.nome, I.sigla, V.sigla
O campo que repete é o V.sigla, sendo que este distinct que fiz no final não funciona. O resultado mostra todas as siglas, inclusive as repetidas.
Resultado:
VARASGT
VARCDGT
VARPGT
RPAGT
ACDGT
APGT
ASGT
CTAPGT
CTAPGT
VARGT
ACDGT
ARGT
CTAPGT
APGT
ASGT
VACPGT
VARASGT
VARCDGT
VARGT
VARPGT
Repare a repetição de APGT, assim como outras - devem aparecer uma vez só.
Alguém poderia me ajudar.
Desde já agradeço.
Flávia
Flavia Lares
Posts
11/02/2020
Mauricio Espido
Por exemplo, abaixo, o distinct funcionará com o JOAO, apenas se o campo abaixo IDADE for removido:
select distinct nome, idade, bairro from endereco NOME | IDADE | BAIRRO JOAO | 20 | SANTO ANDRE JOAO | 21 | SANTO ANDRE ----- e abaixo sem a coluna idade: select distinct nome, bairro from endereco NOME | BAIRRO JOAO | SANTO ANDRE
11/02/2020
Flavia Lares
Vc tem razão, esqueci de considerar outro campo que se repete.
Na query abaixo está o resultado esperado:
SELECT DISTINCT IDV.codIndicador,IDT.codIndicador from IndicadorDaVariavel IDV ,IndicadorDoTema IDT, Atividade A WHERE IDV.codIndicador = IDT.codIndicador and IDT.codTema=9 and A.codAtividade=2 AND IDT.dataRemocao is null GROUP BY IDV.codIndicador, IDT.codIndicador
Só não estou sabendo juntar este distinct na query abaixo:
SELECT A.codAtividade, A.mesInicioAtividade, A.anoInicioAtividade, A.nome, T.codTema, T.mesInicioTema, T.anoInicioTema, T.nome, I.codIndicador, I.mesInicioIndicador, I.anoInicioIndicador, I.sigla, I.nome, I.formula,
V.codVariavel, V.mesInicioVariavel, V.anoInicioVariavel, V.nome , UM.sigla, V.periodicidade
FROM atividade A
INNER JOIN atividadeDoTema ADT
ON A.codAtividade = ADT.codAtividade
AND A.mesInicioAtividade = ADT.mesInicioAtividade
AND A.anoInicioAtividade = ADT.anoInicioAtividade
AND ADT.dataRemocao IS NULL
INNER JOIN tema T
ON T.codtema = ADT.codTema
AND T.mesInicioTema = ADT.mesInicioTema
AND T.anoInicioTema = ADT.anoInicioTema
AND T.dataRemocao IS NULL
INNER JOIN indicadorDoTema IDT
ON T.codtema = IDT.codTema
AND T.mesInicioTema = IDT.mesInicioTema
AND T.anoInicioTema = IDT.anoInicioTema
AND IDT.dataRemocao IS NULL
INNER JOIN indicador I
ON I.codIndicador = IDT.codIndicador
AND I.mesInicioIndicador = IDT.mesInicioIndicador
AND I.anoInicioIndicador = IDT.anoInicioIndicador
AND I.dataRemocao IS NULL
INNER JOIN indicadorDaVariavel IDV
ON I.codIndicador = IDV.codIndicador
AND I.mesInicioIndicador = IDV.mesInicioIndicador
AND I.anoInicioIndicador = IDV.anoInicioIndicador
AND IDV.dataRemocao IS NULL
INNER JOIN variavel V
ON V.codVariavel = IDV.codVariavel
AND V.mesInicioVariavel = IDV.mesInicioVariavel
AND V.anoInicioVariavel = IDV.anoInicioVariavel
AND V.dataRemocao IS NULL
INNER JOIN UnidadeMedida UM
ON V.codUnidadeMedida = UM.codUnidadeMedida
WHERE A.codAtividade = 2 AND T.codTema = 9 AND IDT.dataRemocao is null AND IDV.codIndicador IN (SELECT DISTINCT IDV.codIndicador,IDT.codIndicador from IndicadorDaVariavel IDV ,IndicadorDoTema IDT, Atividade A
WHERE IDV.codIndicador = IDT.codIndicador and IDT.codTema=9 and A.codAtividade=2 AND IDT.dataRemocao is null
GROUP BY IDV.codIndicador, IDT.codIndicador )
ORDER BY A.nome, T.nome, I.sigla, V.sigla
Tentei assim, mas ocorre o seguinte erro:
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
Desde já agradeço.
Flavia
11/02/2020
Anderson Gonçalves
Estou tentando fazer um distinct no campo sigla da variavel e não consigo. Segue a query:
SELECT V.sigla,A.codAtividade, A.mesInicioAtividade, A.anoInicioAtividade, A.nome, T.codTema, T.mesInicioTema, T.anoInicioTema, T.nome, I.codIndicador, I.mesInicioIndicador, I.anoInicioIndicador, I.sigla, I.nome, I.formula,
V.codVariavel, V.mesInicioVariavel, V.anoInicioVariavel, V.nome , UM.sigla, V.periodicidade
FROM atividade A
INNER JOIN atividadeDoTema ADT
ON A.codAtividade = ADT.codAtividade
AND A.mesInicioAtividade = ADT.mesInicioAtividade
AND A.anoInicioAtividade = ADT.anoInicioAtividade
AND ADT.dataRemocao IS NULL
INNER JOIN tema T
ON T.codtema = ADT.codTema
AND T.mesInicioTema = ADT.mesInicioTema
AND T.anoInicioTema = ADT.anoInicioTema
AND T.dataRemocao IS NULL
INNER JOIN indicadorDoTema IDT
ON T.codtema = IDT.codTema
AND T.mesInicioTema = IDT.mesInicioTema
AND T.anoInicioTema = IDT.anoInicioTema
AND IDT.dataRemocao IS NULL
INNER JOIN indicador I
ON I.codIndicador = IDT.codIndicador
AND I.mesInicioIndicador = IDT.mesInicioIndicador
AND I.anoInicioIndicador = IDT.anoInicioIndicador
AND I.dataRemocao IS NULL
INNER JOIN indicadorDaVariavel IDV
ON I.codIndicador = IDV.codIndicador
AND I.mesInicioIndicador = IDV.mesInicioIndicador
AND I.anoInicioIndicador = IDV.anoInicioIndicador
AND IDV.dataRemocao IS NULL
INNER JOIN variavel V
ON V.codVariavel = IDV.codVariavel
AND V.mesInicioVariavel = IDV.mesInicioVariavel
AND V.anoInicioVariavel = IDV.anoInicioVariavel
AND V.dataRemocao IS NULL
INNER JOIN UnidadeMedida UM
ON V.codUnidadeMedida = UM.codUnidadeMedida
WHERE A.codAtividade = 2 AND T.codTema = 9 AND V.sigla in (SELECT DISTINCT V.sigla from Variavel)
ORDER BY A.nome, T.nome, I.sigla, V.sigla
O campo que repete é o V.sigla, sendo que este distinct que fiz no final não funciona. O resultado mostra todas as siglas, inclusive as repetidas.
Resultado:
VARASGT
VARCDGT
VARPGT
RPAGT
ACDGT
APGT
ASGT
CTAPGT
CTAPGT
VARGT
ACDGT
ARGT
CTAPGT
APGT
ASGT
VACPGT
VARASGT
VARCDGT
VARGT
VARPGT
Repare a repetição de APGT, assim como outras - devem aparecer uma vez só.
Alguém poderia me ajudar.
Desde já agradeço.
Flávia
Fala Girl,
Posso saber qual o banco de dados você está usando?
Se for firebird procura pelo comando With ou SubQuery ou Sub Select vai dar uma clareada na sua cabeça o que você está fazendo colocando muitos inners vai carregar a sua busca, então recomendo buscar em blocos ele trás tudo junto para usar em um DBGrid ou Relatório e etc. mas ele busca por etapas.
Se precisar entre em contato pelo Skype
anderson@case13.com.br
12/02/2020
Flavia Lares
Utilizo o banco SQL Server.
Obrigada.
Flávia
13/02/2020
Anderson Gonçalves
Utilizo o banco SQL Server.
Obrigada.
Flávia
Flávia eu até posso ajudar você mas preciso que você entre em contato porque esse seu código pode ser enxugado bastante com o comando With no SQLServer se quiser pode pesquisar mas preciso entender o que o código faz direitinho para poder ajudar, se quiser fala comigo no skype, o seu código é muito grande, então vamos ter que ver por partes e o seu objetivo final.
Skype: anderson@case13.com.br
14/02/2020
Flavia Lares
Utilizo o banco SQL Server.
Obrigada.
Flávia
Flávia eu até posso ajudar você mas preciso que você entre em contato porque esse seu código pode ser enxugado bastante com o comando With no SQLServer se quiser pode pesquisar mas preciso entender o que o código faz direitinho para poder ajudar, se quiser fala comigo no skype, o seu código é muito grande, então vamos ter que ver por partes e o seu objetivo final.
Skype: anderson@case13.com.br
14/02/2020
Flavia Lares
Utilizo o banco SQL Server.
Obrigada.
Flávia
Flávia eu até posso ajudar você mas preciso que você entre em contato porque esse seu código pode ser enxugado bastante com o comando With no SQLServer se quiser pode pesquisar mas preciso entender o que o código faz direitinho para poder ajudar, se quiser fala comigo no skype, o seu código é muito grande, então vamos ter que ver por partes e o seu objetivo final.
Skype: anderson@case13.com.br
Oi Anderson.
Ok, já fiz a chamada no seu skype.
Obrigada. Flavia
Clique aqui para fazer login e interagir na Comunidade :)