سؤال

ودعونا نقول لدي الاستعلام 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

وأود الإخراج التالي، أن الجماعات التي لbillId التي ليست NULL:

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

وهذا هو تافه أكثر كفاءة من MIN إذا كنت حقا لا يهمني ما meetingID سيتم إرجاع طالما أنه ينتمي إلى مجموعة الصحيحة.

نصائح أخرى

هل يمكن أن الاتحاد 2 الاستفسارات، واحدة منها لا المجموعات في إدخالات غير فارغة، والآخر أن يحصل على تلك فارغة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top