Jump to content

Archived

This topic is now archived and is closed to further replies.

FabianoSouza

Tratar duplicidade (distinct não está funcionando).

Recommended Posts

É amigos...pesquisei bastante e fiz muitas tentativas...não consegui mesclar as duas consultas.

Se alguém conseguir realizar esta façanha ficarei extremamente agradecido.

 

Pelo que li a consulta que o Motta criou é do tipo de subconsulta correlacionada (vi o assunto neste link

).

 

A.Jr. e Motta, muito obrigado pela ajuda que deram. Vou continuar em minha peregrinação para tentar unir estas consultas.

 

Valew!

Share this post


Link to post
Share on other sites

Mas acho que o problema continua sendo o que falei no post #9, a duplicidade É o problema.

 

Ficar tentando fazer a sql contornar o problema não é a melhor solução.

Share this post


Link to post
Share on other sites

Entendi Motta. Mas não vejo outra saída do ponto de vista de modelagem para o seguinte cenário.

Um evento pode ser realizado por vários dias. Entendi que seria mais adequado ter uma tabela para armazenar esta datas, ao invés de criar um novo evento (como mesmo nome) em datas diferentes.

 

Além disso posso usar a tab DATAS para guardar datas para qualquer outra atividade do sistema. Por exemplo, um processo de seleção de candidatos, uma campanha e por ai vai. Basta usar uma a chave para ligar as tabelas.

 

Vê outra forma de modelar isso?

Share this post


Link to post
Share on other sites

Vamos por partes que eu já perdi o "fio da meada".

3 tabelas em que você precisa dos campos:

MAX(CompartilhamentoCodItem)

MAX(FavoritosCodRegistro)

MIN(DATA)

 

é isso??

Share this post


Link to post
Share on other sites

Veja se isso funciona:

 SELECT REPLICATE('0', 6 - LEN(EVENTOS.EventosCod)) AS RepeteN, EVENTOS.EventosCod, EVENTOS.EventosTitulo, COMPARTILHAMENTO.CompartilhamentoCod, FAVORITOS.FavoritosCod, EVENTOS.EventosDataCad, COMPARTILHAMENTO.CompartilhamentoCodItem, FAVORITOS.FavoritosCodRegistro, E2.DataInicioFROM EVENTOSLEFT OUTER JOIN(SELECT MAX(CompartilhamentoCodItem) AS CompartilhamentoCod, CompartilhamentoCodItemFROM COMPARTILHAMENTO AS COMPARTILHAMENTO_1GROUP BY CompartilhamentoCodItem) AS COMPARTILHAMENTO  ON COMPARTILHAMENTO.CompartilhamentoCodItem = EVENTOS.EventosCodLEFT OUTER JOIN(SELECT MAX(FavoritosCodRegistro) AS FavoritosCod, FavoritosCodRegistroFROM FAVORITOS AS FAVORITOS_1GROUP BY FavoritosCodRegistro) AS FAVORITOS  ON FAVORITOS.FavoritosCodRegistro = EVENTOS.EventosCod LEFT OUTER JOIN(SELECT MIN(E2.DatasDataInicio) AS DataInicio, EventosCodFROM EVENTOS E2        ) AS EVENTOS2 ON EVENTOS.DatasDataInicio = E2.DataInicioAND EVENTOS.EventosCod = E2.EventosCod 
Só coloquei um subselect no final.


Faltou um Group by no SUBSELECT!!! Não consegui editar:

 

LEFT OUTER JOIN(SELECT MIN(E2.DatasDataInicio) AS DataInicio, E2.EventosCodFROM EVENTOS E2group by E2.EventosCod        ) AS EVENTOS2 ON EVENTOS.DatasDataInicio = E2.DataInicioAND EVENTOS.EventosCod = E2.EventosCod
Observe os itens em negrito!

Share this post


Link to post
Share on other sites

Os erros foram:

 

Mensagem 207, Nível 16, Estado 1, Linha 43

Nome de coluna 'DatasDataInicio' inválido.

Mensagem 207, Nível 16, Estado 1, Linha 49

Nome de coluna 'DatasDataInicio' inválido.

Mensagem 4104, Nível 16, Estado 1, Linha 49

O identificador de várias partes "E2.DataInicio" não pôde ser associado.

Mensagem 4104, Nível 16, Estado 1, Linha 51

O identificador de várias partes "E2.EventosCod" não pôde ser associado.

Mensagem 4104, Nível 16, Estado 1, Linha 17

O identificador de várias partes "E2.DatasDataInicio" não pôde ser associado.

 

Começando pela ordem. A linha 17 é esta

, E2.DataInicio

 

Campos començando com DataAlgumaCoisa ficam na tab DATAS. No caso está em E2 (Eventos, não é?).

Acho que esta linha é que gera os erros seguintes.

 

Mas to vendo aqui se consigo acertar a os nomes..

Share this post


Link to post
Share on other sites

Ah tá. Tudo junto seria isso?

 

SELECT REPLICATE('0', 6 - LEN(EVENTOS.EventosCod)) AS RepeteN

, EVENTOS.EventosCod

, EVENTOS.EventosTitulo

, COMPARTILHAMENTO.CompartilhamentoCod

, FAVORITOS.FavoritosCod

, EVENTOS.EventosDataCad

, COMPARTILHAMENTO.CompartilhamentoCodItem

, FAVORITOS.FavoritosCodRegistro

, E2.DataInicio

FROM EVENTOS

LEFT OUTER JOIN

(SELECT MAX(CompartilhamentoCodItem) AS CompartilhamentoCod, CompartilhamentoCodItem

FROM COMPARTILHAMENTO AS COMPARTILHAMENTO_1

GROUP BY CompartilhamentoCodItem) AS COMPARTILHAMENTO

ON COMPARTILHAMENTO.CompartilhamentoCodItem = EVENTOS.EventosCod

LEFT OUTER JOIN

(SELECT MAX(FavoritosCodRegistro) AS FavoritosCod, FavoritosCodRegistro

FROM FAVORITOS AS FAVORITOS_1

GROUP BY FavoritosCodRegistro) AS FAVORITOS

ON FAVORITOS.FavoritosCodRegistro = EVENTOS.EventosCod

LEFT OUTER JOIN

(SELECT MIN(E2.DatasDataInicio) AS DataInicio, E2.EventosCod

FROM EVENTOS E2

group by E2.EventosCod

) AS EVENTOS2

ON EVENTOS.DatasDataInicio = E2.DataInicio

AND EVENTOS.EventosCod = E2.EventosCod

 

 

A primeira linha do erro continua a 17

, E2.DataInicio

Share this post


Link to post
Share on other sites

Erro meu.

Nas tres ultimas linhas:

 

 
) AS EVENTOS2
ON EVENTOS.DatasDataInicio = EVENTOS2.DataInicio
AND EVENTOS.EventosCod = EVENTOS2.EventosCod



ah.. e lah em cima..

ao inves disso

E2.DataInicio

é isso

EVENTOS2.DataInicio

Share this post


Link to post
Share on other sites

Coloca o campo que precisa da data ai.

Não é a DatasDataInicio? Não consegui ver a estrutura da tabela de Eventos.



Esquece. Tive que ler o tópico todo ¬¬

 

 SELECT REPLICATE('0', 6 - LEN(EVENTOS.EventosCod)) AS RepeteN, EVENTOS.EventosCod, EVENTOS.EventosTitulo, COMPARTILHAMENTO.CompartilhamentoCod, FAVORITOS.FavoritosCod, EVENTOS.EventosDataCad, COMPARTILHAMENTO.CompartilhamentoCodItem, FAVORITOS.FavoritosCodRegistro, DT.DataInicioFROM EVENTOSLEFT OUTER JOIN(SELECT MAX(CompartilhamentoCodItem) AS CompartilhamentoCod, CompartilhamentoCodItemFROM COMPARTILHAMENTO AS COMPARTILHAMENTO_1GROUP BY CompartilhamentoCodItem) AS COMPARTILHAMENTO  ON COMPARTILHAMENTO.CompartilhamentoCodItem = EVENTOS.EventosCodLEFT OUTER JOIN(SELECT MAX(FavoritosCodRegistro) AS FavoritosCod, FavoritosCodRegistroFROM FAVORITOS AS FAVORITOS_1GROUP BY FavoritosCodRegistro) AS FAVORITOS  ON FAVORITOS.FavoritosCodRegistro = EVENTOS.EventosCod LEFT OUTER JOIN(SELECT MIN(DatasDataInicio) AS DataInicio, DatasCodItemFROM DATASGROUP BY DatasCodItem        ) AS DT ON  DT.DatasCodItem = EVENTOS.EventosCod 
Agora vai :devil:

Share this post


Link to post
Share on other sites

de novo:

  SELECT REPLICATE('0', 6 - LEN(EVENTOS.EventosCod)) AS RepeteN, EVENTOS.EventosCod, EVENTOS.EventosTitulo, COMPARTILHAMENTO.CompartilhamentoCod, FAVORITOS.FavoritosCod, EVENTOS.EventosDataCad, COMPARTILHAMENTO.CompartilhamentoCodItem, FAVORITOS.FavoritosCodRegistro, DT.DataInicioFROM EVENTOSLEFT OUTER JOIN(SELECT MAX(CompartilhamentoCodItem) AS CompartilhamentoCod, CompartilhamentoCodItemFROM COMPARTILHAMENTO AS COMPARTILHAMENTO_1GROUP BY CompartilhamentoCodItem) AS COMPARTILHAMENTO  ON COMPARTILHAMENTO.CompartilhamentoCodItem = EVENTOS.EventosCodLEFT OUTER JOIN(SELECT MAX(FavoritosCodRegistro) AS FavoritosCod, FavoritosCodRegistroFROM FAVORITOS AS FAVORITOS_1GROUP BY FavoritosCodRegistro) AS FAVORITOS  ON FAVORITOS.FavoritosCodRegistro = EVENTOS.EventosCod LEFT OUTER JOIN(SELECT MIN(DatasDataInicio) AS DataInicio, DatasCodItemFROM DATASGROUP BY DatasCodItem        ) AS DT ON  DT.DatasCodItem = EVENTOS.EventosCod 
e vamos que vamos...

Share this post


Link to post
Share on other sites

Pactha q lariu!

 

Parece que funcionou...desta vez não vou comemorar antes hehehe...vou fazer uns testes durante o dia.

Mais tarde dou um retorno final.

 

 

Suuuper obrigado!

Share this post


Link to post
Share on other sites

Uma coisa que tem que se atentar, são as referencias (chaves) que estao sendo utilizadas para fazer os JOINS.

De resto, irá sempre trazer um registro.

Ressalto que este é um modo "paliativo", pois isso deveria ter sido feito na modelagem, mas para não alterar a estrutura do que tem, faça deste modo.

Cuidado com a performance deste select. Aconselho a fazer uma procedure para o retorno dos dados e verificar o plano de execução para criação (ou não) de índices.

 

Qq coisa pode retornar.

 

[]´s e boa sorte!

Share this post


Link to post
Share on other sites

Salve pessoal! Obrigado pela ajuda e paciência. A consulta está funcionando redonda. Inclusive já criei a procedure como sugerido e a implementei na página.

 

Fui verificar o tal do plano de execução. Ainda não entendendo muito bem esta ferramenta. Mas mostra assim.

Consulta 1 : Custo da consulta (relativo ao lote) : 25%.

 

O mesmo ocorre para consulta 2, 3 e 4. Como não lido com bd de forma mais aprofundada fico sem saber se este percentual é bom ou ruim.

Share this post


Link to post
Share on other sites

Plano de execução é um caso a parte. É uma ferramenta completa e complexa, mas olhe primeiramente se nao tem nenhum "table scan" na sua consulta, e se a busca esta sendo realizada pelos indices. De resto, infelizmente, somente analisando o ambiente!

 

Que bom que deu certo! Agora é descansar e curtir o carnaval!!!

 

Até mais!!!

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.