Falle
Join-Fan-out
Ein Join mit zwei 1:n-Tabellen vervielfacht die Zeilen, und die Summen wachsen mit.
Eine Bestellung mit 3 Positionen und 2 Zahlungen ergibt 6 Zeilen, wenn Sie beide joinen: Jede Position wird doppelt gezählt. Aggregieren Sie zuerst jede Kindtabelle auf die Granularität der Bestellung, dann joinen Sie die Ergebnisse.
Die Falle
SELECT o.order_id, SUM(l.quantity * l.unit_price) AS ordered FROM orders o JOIN order_lines l ON l.order_id = o.order_id JOIN payments p ON p.order_id = o.order_id WHERE o.order_id = 14 GROUP BY o.order_id;
| order_id | ordered |
|---|---|
| 14 | 235.00 |
Die Korrektur
SELECT o.order_id, SUM(l.quantity * l.unit_price) AS ordered FROM orders o JOIN order_lines l ON l.order_id = o.order_id WHERE o.order_id = 14 GROUP BY o.order_id;
| order_id | ordered |
|---|---|
| 14 | 117.50 |