Heim >Datenbank >MySQL-Tutorial >Warum gibt mein LEFT JOIN in PostgreSQL keine Null-Zählungen zurück?

Warum gibt mein LEFT JOIN in PostgreSQL keine Null-Zählungen zurück?

DDD
DDDOriginal
2025-01-14 10:57:44904Durchsuche

Why Doesn't My LEFT JOIN Return Zero Counts in PostgreSQL?

PostgreSQL LEFT JOIN: Sicherstellen, dass keine Zählungen zurückgegeben werden

Ein häufiges Problem bei LEFT JOIN von PostgreSQL ist, dass Zeilen mit der Anzahl Null nicht zurückgegeben werden können. Dies tritt auf, wenn Filterbedingungen falsch platziert sind.

Berücksichtigen Sie diese Abfrage, die darauf ausgelegt ist, Prüfungselemente pro Organisation zu zählen, aber nur Organisationen zurückzugeben, deren Anzahl über Null liegt:

<code class="language-sql">select o.name as organisation_name,
coalesce(COUNT(exam_items.id)) as total_used
from organisations o
left join exam_items e on o.id = e.organisation_id
where e.item_template_id = #{sanitize(item_template_id)}
and e.used = true
group by o.name
order by o.name</code>

Korrigieren der Abfrage

Das Problem liegt in der WHERE-Klausel. Die hier platzierten Bedingungen filtern nach dem Beitritt und entfernen effektiv Null-Zählungsorganisationen. Die Lösung besteht darin, die Filterbedingungen in die JOIN-Klausel selbst zu verschieben:

<code class="language-sql">SELECT o.name AS organisation_name, count(e.id) AS total_used
FROM organisations o
LEFT JOIN exam_items e ON e.organisation_id = o.id 
                        AND e.item_template_id = #{sanitize(item_template_id)}
                        AND e.used
GROUP BY o.name
ORDER BY o.name;</code>

Durch die Integration der Filter in JOIN stellen wir sicher, dass nur übereinstimmende Zeilen in den Join-Vorgang einbezogen werden. Dies verhindert den versehentlichen Ausschluss von Organisationen mit Nullzählungen.

Wichtige Hinweise:

  • COUNT()s Verhalten: Im Gegensatz zu vielen Aggregatfunktionen gibt COUNT() niemals NULL zurück. Daher ist COALESCE(COUNT(col)) überflüssig.
  • Spalten-Nullwerte: Wenden Sie COUNT() auf eine NOT NULL-Spalte an oder stellen Sie sicher, dass die Join-Bedingung Nicht-Null-Werte garantiert.
  • Optimierung: Erwägen Sie aus Gründen der Leistung, insbesondere bei großen Datensätzen, die Zählungen in einer Unterabfrage vorab zu aggregieren, bevor Sie sie mit der Tabelle „Organisationen“ verknüpfen. Dies ist besonders vorteilhaft, wenn die meisten oder alle Zeilen gezählt werden.

Das obige ist der detaillierte Inhalt vonWarum gibt mein LEFT JOIN in PostgreSQL keine Null-Zählungen zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn