Pergunta

Vamos dizer que eu tenho a seguinte consulta SQL:

SELECT Meeting.id AS meetingId, Bill.id AS billId
FROM Meeting 
LEFT JOIN Bill ON Meeting.FK_BillId = Bill.id

que gera o seguinte:

meetingId | billId
------------------
     a    |  NULL
     b    |  NULL
     c    |     1
     d    |     1
     e    |     1
     f    |     2
     g    |     2

E eu gostaria o seguinte resultado, que os grupos de billId de que não são NULL:

meetingId | billId
------------------
     a    |  NULL
     b    |  NULL
     c    |     1
     f    |     2

Como posso conseguir isso? By the way, eu não estou preocupado com a meetingId ambígua dos resultados agrupados.

Obrigado por sua ajuda!

Foi útil?

Solução

Em SQL Server:

SELECT  meetingId, billid
FROM    (
        SELECT  ROW_NUMBER() OVER (PARTITION BY billId ORDER BY meetingID) AS rn,
                m.*
        FROM    mytable m
        ) q
WHERE   rn = 1 OR billid IS NULL

ANSI:

SELECT  MIN(meetingId), billid
FROM    mytable
WHERE   billid IS NOT NULL
GROUP BY
        billId
UNION ALL
SELECT  meetingId, billId
FROM    mytable
WHERE   billid IS NULL

MySQL:

SELECT  meetingId, billid
FROM    mytable
WHERE   billid IS NOT NULL
GROUP BY
        billId
UNION ALL
SELECT  meetingId, billId
FROM    mytable
WHERE   billid IS NULL

Este é um pouco mais eficiente do que MIN se você realmente não se preocupam com o que meetingID será devolvido, desde que ele pertence ao grupo certo.

Outras dicas

Você poderia união 2 consultas, um dos quais faz os grupos nas entradas não nulas, e outro que recebe os nulos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top