Domanda

Diciamo che ho la seguente query SQL:

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

Questo genera il seguente:

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

E vorrei il seguente output, che raggruppa per billId che non sono NULL:

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

Come posso raggiungerlo? A proposito, non mi preoccupa l'ambigua riunioneId dei risultati raggruppati.

Grazie per l'aiuto!

È stato utile?

Soluzione

In 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

Questo è un po 'più efficiente di MIN se non ti interessa davvero quale meetingID verrà restituito fintanto che appartiene al gruppo giusto.

Altri suggerimenti

È possibile unire 2 query, una delle quali esegue i gruppi nelle voci non nulle e l'altra che ottiene quelle nulle.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top