Distinct com inner join não funciona
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
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
Curtidas 0
Respostas
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:
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
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
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
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
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
11/02/2020
Oi Anderson.
Utilizo o banco SQL Server.
Obrigada.
Flávia
Utilizo o banco SQL Server.
Obrigada.
Flávia
GOSTEI 0
Anderson Gonçalves
11/02/2020
Oi Anderson.
Utilizo o banco SQL Server.
Obrigada.
Flávia
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
11/02/2020
Oi Anderson.
Utilizo o banco SQL Server.
Obrigada.
Flávia
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
11/02/2020
Oi Anderson.
Utilizo o banco SQL Server.
Obrigada.
Flávia
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