Distinct com inner join não funciona

SQL Server

11/02/2020

Bom dia pessoal!!

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

Flavia Lares

Curtidas 0

Respostas

Mauricio Espido

Mauricio Espido

11/02/2020

Se está aparecendo duplicado, então é algum campo de outra coluna que a informação está variando.
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

GOSTEI 0
Flavia Lares

Flavia Lares

11/02/2020

Oi Mauricio.
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



GOSTEI 0
Anderson Gonçalves

Anderson Gonçalves

11/02/2020

Bom dia pessoal!!

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
GOSTEI 0
Flavia Lares

Flavia Lares

11/02/2020

Oi Anderson.

Utilizo o banco SQL Server.

Obrigada.

Flávia
GOSTEI 0
Anderson Gonçalves

Anderson Gonçalves

11/02/2020

Oi Anderson.

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
GOSTEI 0
Flavia Lares

Flavia Lares

11/02/2020

Oi Anderson.

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
GOSTEI 0
Flavia Lares

Flavia Lares

11/02/2020

Oi Anderson.

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
GOSTEI 0
POSTAR