Frage

Lassen Sie uns sagen, dass ich die folgende SQL-Abfrage haben:

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

Das gibt folgende Möglichkeiten:

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

Und ich mag die folgende Ausgabe, dass Gruppen von billId ist, die nicht NULL sind:

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

Wie kann ich das erreichen? By the way, bin ich von der zweideutigen MeetingID der gruppierten Ergebnisse nicht betroffen.

Vielen Dank für Ihre Hilfe!

War es hilfreich?

Lösung

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

Dies ist ein wenig effizienter als MIN wenn Sie sich wirklich egal, was meetingID wird so lange zurückgeführt werden, wie es auf der rechten Seite Gruppe gehört.

Andere Tipps

Sie könnten Union 2 Abfragen, von denen tut die Gruppen in den Nicht-Null-Einträge, und der andere, dass die Null Einsen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top