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.
Atenciosamente,
--
Matheus de Oliveira
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral