SQL مجموعة مشروطة BY: كيف نفعل ذلك؟
سؤال
ودعونا نقول لدي الاستعلام 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 الاستفسارات، واحدة منها لا المجموعات في إدخالات غير فارغة، والآخر أن يحصل على تلك فارغة.
لا تنتمي إلى StackOverflow