Heim >Datenbank >MySQL-Tutorial >Warum gibt mein PostgreSQL LEFT JOIN keine Zeilen mit einer Anzahl von 0 zurück?

Warum gibt mein PostgreSQL LEFT JOIN keine Zeilen mit einer Anzahl von 0 zurück?

DDD
DDDOriginal
2025-01-14 11:12:10497Durchsuche

Why Doesn't My PostgreSQL LEFT JOIN Return Rows with a Count of 0?

PostgreSQL LEFT JOIN und fehlende Nullzählungen

PostgreSQLs LEFT JOIN ist so konzipiert, dass alle Zeilen aus der linken Tabelle zurückgegeben werden, auch wenn es in der rechten Tabelle keine Übereinstimmung gibt. Allerdings können falsch platzierte WHERE-Klauselbedingungen ein LEFT JOIN effektiv in ein INNER JOIN umwandeln und Zeilen mit der Anzahl Null auslassen.

Dieses Problem tritt häufig auf, wenn Filterbedingungen basierend auf der richtigen Tabelle in die WHERE-Klausel eingefügt werden. Betrachten Sie dieses Beispiel:

<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>

Die WHERE-Klausel filtert exam_items nach bestimmten item_template_id und used = true. Dies filtert nach der Verknüpfung und entfernt Zeilen aus organisations, die keine übereinstimmenden Zeilen in exam_items haben, die diese Bedingungen erfüllen.

Die Lösung: Filterung auf die JOIN-Bedingung verlagern

Um alle Zeilen von organisations beizubehalten, auch diejenigen ohne übereinstimmende Zeilen in exam_items, verschieben Sie die Filterbedingungen von der WHERE-Klausel in die JOIN-Klausel:

<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 = true
GROUP  BY o.name
ORDER  BY o.name</code>

Jetzt erfolgt die Filterung während der Verknüpfung. Nur exam_items Zeilen, die die Kriterien erfüllen, werden für den Join berücksichtigt. organisations Zeilen ohne übereinstimmende Zeilen werden weiterhin einbezogen, was zu total_used Werten von 0 führt.

Weitere Optimierung: COUNT() und COALESCE

Die ursprüngliche Abfrage verwendet COALESCE(COUNT(exam_items.id)). Das ist überflüssig. COUNT() kehrt nie zurück NULL; es gibt 0 zurück, wenn keine Zeilen übereinstimmen. Daher ist COALESCE unnötig und kann zur Verbesserung der Abfrageeffizienz entfernt werden.

Das obige ist der detaillierte Inhalt vonWarum gibt mein PostgreSQL LEFT JOIN keine Zeilen mit einer Anzahl von 0 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