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

Warum gibt mein LEFT JOIN in PostgreSQL falsche Zählungen zurück?

DDD
DDDOriginal
2025-01-14 11:17:43128Durchsuche

Why Does My LEFT JOIN Return Incorrect Counts in PostgreSQL?

PostgreSQL LEFT JOIN: Behebung falscher Zählergebnisse

Wenn Sie in PostgreSQL einen LEFT JOIN verwenden, um Einträge pro Organisation zu zählen, kann es vorkommen, dass nur Organisationen zurückgegeben werden, deren Anzahl größer als Null ist. Dies widerspricht dem erwarteten Verhalten eines LEFT JOIN, der alle Organisationen umfassen sollte, unabhängig davon, ob sie übereinstimmende Einträge in der verbundenen Tabelle haben.

Korrektur der LEFT JOIN-Abfrage

Das Problem entsteht typischerweise durch die falsche Platzierung von Filterbedingungen. Die folgende überarbeitete Abfrage zeigt den richtigen Ansatz:

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

Die entscheidende Änderung besteht darin, die e.used-Bedingung aus der WHERE-Klausel (wo sie als Filter nach dem Join fungiert) in die ON-Klausel (wo sie als Join-Bedingung fungiert) zu verschieben ). Dadurch wird sichergestellt, dass nur übereinstimmende Zeilen, die alle Bedingungen erfüllen, in den Join selbst einbezogen werden, wodurch die unbeabsichtigte Filterung von Organisationen mit Nullzählungen verhindert wird.

Optimierter Ansatz: Voraggregation

Für eine verbesserte Leistung, insbesondere beim Umgang mit großen Datensätzen, ziehen Sie diese alternative Abfrage in Betracht:

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

Diese Methode aggregiert zunächst die Zählungen innerhalb einer Unterabfrage und führt dann den Join durch. Diese Vorabaggregation kann die Effizienz erheblich steigern, insbesondere wenn ein erheblicher Teil der exam_items-Zeilen in die Zählung einbezogen wird. Die Funktion COALESCE behandelt Fälle, in denen total_used NULL ist (für Organisationen ohne übereinstimmende Einträge) und ersetzt sie aus Konsistenzgründen durch 0.

Das obige ist der detaillierte Inhalt vonWarum gibt mein LEFT JOIN in PostgreSQL falsche 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