2015-07-14 8:14 GMT-03:00 Paulo Vitor Bettini de Albuqerque Lima < paulovitor...@gmail.com>:
> 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. Atenciosamente, -- Matheus de Oliveira
_______________________________________________ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral