質問

次の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エントリを取得します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top