SQL الاستعلام الفرعي
سؤال
لدي بيانات SQL التي تبدو مثل هذا
events
id name capacity
1 Cooking 10
2 Swimming 20
3 Archery 15
registrants
id name
1 Jimmy
2 Billy
3 Sally
registrant_event
registrant_id event_id
1 3
2 3
3 2
أود أن حدد كافة الحقول في الأحداث وكذلك حقل إضافي أن عدد الأشخاص الذين هم حاليا تسجيل هذا الحدث.في هذه الحالة الرماية قد 2 للمسجلين, السباحة سيكون 1 و الطبخ سيكون 0.
أتصور أن هذا يمكن أن يتحقق في استعلام واحد ولكن لست متأكدا من بناء الجملة الصحيح. كيف استعلام تكون مكتوبة الحصول على هذه البيانات ؟
تحديث:شكرا على الاجابات الصحيحة لك كل صخرة!
المحلول
SELECT e.*, ISNULL(ec.TotalRegistrants, 0) FROM events e LEFT OUTER JOIN
(
SELECT event_id, Count(registrant_id) AS TotalRegistrants
FROM registrant_event
GROUP BY event_id
) ec ON e.id = ec.event_id
نصائح أخرى
SELECT Events.ID, Events.Name, Events.Capacity,
ISNULL(COUNT(Registrant_Event.Registrant_ID), 0)
FROM Events
LEFT OUTER JOIN Registrant_Event ON Events.ID = Registrant_Event.Event_ID
GROUP BY Events.ID, Events.Name, Events.Capacity
select d.id1, d.name, d.cappacity, count(d.b_id) as number_of_people
from (select eve.id1,eve.name,eve.cappacity,re_eve.b_id
from eve left join re_eve on eve.id1 = re_eve.b_id) d
group by d.id1, d.name, d.cappacity
أنا اختبرت هذا في أوراكل 11g, ويبدو أن العمل
SELECT e.id, e.name, e.capacity, COUNT(re.event_id)
FROM events e
LEFT JOIN registrant_event re
ON e.id = re.event_id
GROUP BY e.id, e.name, e.capacity
select e.id, e.name, e.capacity, IsNull(re.eventCount,0) from events e
left join (
select count(event_id) as eventCount, event_id from registrant_event group by event_id
) re
on e.id = re.event_id
SELECT e.id, count(*) AS NumRegistrants
FROM events e
LEFT JOIN registrant_event re ON re.event_id=e.id
GROUP BY e.id
علما بأن هذا سيعود 1 بدلا من 0 للأحداث مع المسجلين.للحصول على عرض 0 بدلا من ذلك, يمكنك الحصول على أكثر تعقيدا:
SELECT *,
(SELECT COUNT(*) FROM registrant_event WHERE event_id=id) AS NumRegistrants
FROM events
SELECT
events.*
, COUNT(registrant_event.registrant_id) AS registrantsCount
FROM events
LEFT JOIN registrant_event ON events.id = registrant_event.event_id
GROUP BY events.id
لا تنتمي إلى StackOverflow