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

Responder a