Frage
Ich habe SQL-Daten, die wie folgt aussehen
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
Ich möchte alle Felder in ‚Event‘ sowie ein zusätzliches Feld wählen, die die Zahl der Menschen, die für dieses Ereignis zur Zeit registriert sind. In diesem Fall würde Archery 2 Registranten hat, Schwimmen 1 haben würde, und Kochen würde 0 haben.
Ich stelle mir dies in einer einzigen Abfrage erreicht werden könnte, aber ich bin die richtigen Syntax nicht sicher. Wie würde eine Abfrage geschrieben wird, dass die Daten zu bekommen?
Update: Vielen Dank für die tollen Antworten, Sie alle Röcke
Lösung
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
Andere Tipps
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
Getestet habe ich diese in Oracle 11g, und es scheint zu funktionieren
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
Beachten Sie, dass diese 1 zurückkehren wird anstelle von 0 für Ereignisse ohne Registranten. Um es 0 statt zu zeigen, haben Sie bekommen ein wenig komplizierter:
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