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

Responder a