質問
次のSQLクエリがあるとします:
SELECT Meeting.id AS meetingId, Bill.id AS billId
FROM Meeting
LEFT JOIN Bill ON Meeting.FK_BillId = Bill.id
次の結果が出力されます。
meetingId | billId
------------------
a | NULL
b | NULL
c | 1
d | 1
e | 1
f | 2
g | 2
そして、次の出力が必要です。この出力は、nullではないbillIdによってグループ化されます。
meetingId | billId
------------------
a | NULL
b | NULL
c | 1
f | 2
どうすればそれを達成できますか?ところで、グループ化された結果のあいまいなmeetingIdについては心配していません。
ご協力ありがとうございます!
解決
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
適切なグループに属している限り、 meetingID
が何を返すかを本当に気にしないのであれば、これは MIN
よりも効率的です。
他のヒント
2つのクエリを結合できます。1つは非nullエントリのグループを実行し、もう1つはnullエントリを取得します。
所属していません StackOverflow