Em 14 de julho de 2015 09:28, Matheus de Oliveira <[email protected]> escreveu: > > > 2015-07-14 8:14 GMT-03:00 Paulo Vitor Bettini de Albuqerque Lima > <[email protected]>: >> >> 1) tabela de convidados, onde convidados com o mesmo e-mail estão >> "bagunçando" o sistema. Deveria ter sido criada uma chave de unicidade, mas >> não foi. E agora, deu zebra. >> 2) tabela de pedidos, onde um convidado escolhe um determinado item. >> >> Estou com muita dificuldade para fazer um select que me mostre quais os >> convidados possuem pedidos, contudo gostaria de filtrar por convidados que >> possuem o mesmo e-mail duplicado (ou *3, *4, etc.). > > > Quando você diz "mostre quais os confidados que possuem pedidos", a cláusula > EXISTS vem à minha mente, fica bem parecido com sua consulta original: > > SELECT lower(c.no_email) email, count(c.no_email), > array_agg(c.id_convidado) convidado > FROM srm.convidado c > WHERE EXISTS( > SELECT 1 > FROM srm.pedido p > WHERE p.id_convidado = c.id_convidado > ) > GROUP BY lower(c.no_email) > HAVING count(c.no_email) > 1; > > A consulta acima vai trazer todo convidado que possui pedido e que exista > outro convidado (que também possua pedido) e tenha o mesmo e-mail. Se você > quiser filtrar por convidados com e-mail duplicado mesmo que somente um deles > tenha pedido, penso no seguinte método: > > SELECT lower(c.no_email) email, count(c.no_email), > array_agg(c.id_convidado) convidado > FROM srm.convidado c > WHERE EXISTS( > SELECT 1 > FROM srm.pedido p > JOIN srm.convidado c2 ON p.id_convidado = c2.id_convidado > WHERE lower(c2.no_email) = lower(c.no_email) > ) > GROUP BY lower(c.no_email) > HAVING count(c.no_email) > 1; > > Outra forma seria separar em subconsultas e fazer a junção. Não tenho certeza > de cara qual seria mais eficiente, se não tiver muitos registros a consulta > acima deve atender em tempo hábil.
Valeu Matheus. A segunda forma fez exatamente o que eu precisava. As tabelas são pequenas (convidados com 400 linhas, e pedidos com 2000 linhas) e como eu preciso disso para fazer uma limpeza nesses convidados com emails duplicados, vai ser executado só uma vez. Aí eu vou apagar os registros "sujos" e colocar uma constraint pra evitar que essa situação se repita. Muito obrigado. > > Atenciosamente, > -- > Matheus de Oliveira > > > > _______________________________________________ > pgbr-geral mailing list > [email protected] > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral > _______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
