Distinct com inner join não funciona

11/02/2020

14

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
Responder

Posts

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

Responder

11/02/2020

Flavia Lares

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



Responder
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
Responder

12/02/2020

Flavia Lares

Oi Anderson.

Utilizo o banco SQL Server.

Obrigada.

Flávia
Responder
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
Responder

14/02/2020

Flavia Lares

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
Responder

14/02/2020

Flavia Lares

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
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar