Optimierung der SQL -Anweisung, um Abfrage zu verwenden
-
28-10-2019 - |
Frage
Gibt es in einer SQL -Abfrage eine Möglichkeit in Oracle, auf eine Spalte innerhalb einer Unterabfrage zu verweisen, die sich außerhalb davon befindet, oder um diesen Effekt zu erzielen, selbst wenn über ein anderes Mittel? Alles, was ich bisher im Web gelesen habe, hat dabei einfach nicht geholfen.
Zum Beispiel (so etwas, nach dem ich nachgekommen bin):
SELECT a.product_code, b.received, b.issued
FROM productinfo a,
(SELECT SUM(qty_received) AS received, SUM(qty_issued) AS issued
FROM productdetail b WHERE b.product_code = a.product_code AND active = 1);
Ich habe viele verschiedene Variationen/Kombinationen ausprobiert, sobald ich Fehler wie ORA-00904: Ungültige Kennung in Bezug auf die Where-Klausel-Beziehung bekomme.
Gegenwärtig, wenn ich als separate Fragen laufe, z. B.:
SELECT product_code FROM productinfo;
und dann für jede dieser Aufzeichnungen:
SELECT SUM(qty_received) AS received, SUM(qty_issued) AS issued FROM productdetail
WHERE product_code = '(specified)' AND active = 1;
Dies kann über eine halbe Stunde dauern, um 8000 Rekorde zu betreiben, was einfach nur dumm ist.
Aus den Haaren geht jede Hilfe geschätzt !! Vielen Dank.
Lösung
Der ORA -Fehler liegt daran, dass Sie die abgeleitete Tabelle/Inline -Ansicht nicht korrelieren können - Sie müssen die Join -Notation verwenden (ANSI -89 oder 92).
Vorausgesetzt, Sie benötigen wirklich Spalten aus dem PRODUCTINFO
Tabelle, Verwendung:
SELECT a.product_code, b.received, b.issued
FROM PRODUCTINFO a
JOIN (SELECT t.product_code,
SUM(t.qty_received) AS received,
SUM(t.qty_issued) AS issued
FROM PRODUCTDETAIL t
WHERE t.active = 1
GROUP BY t.produce_code) b ON b.product_code = a.product_code
Wenn Sie eine Liste der ProductInfo -Datensätze anzeigen möchten, die möglicherweise Produktdetail -Datensätze haben oder nicht, verwenden Sie:
SELECT a.product_code, b.received, b.issued
FROM PRODUCTINFO a
LEFT JOIN (SELECT t.product_code,
SUM(t.qty_received) AS received,
SUM(t.qty_issued) AS issued
FROM PRODUCTDETAIL t
WHERE t.active = 1
GROUP BY t.produce_code) b ON b.product_code = a.product_code
Das Beispiel sieht jedoch so aus, als müssten Sie möglicherweise nur verwenden:
SELECT t.product_code,
SUM(t.qty_received) AS received,
SUM(t.qty_issued) AS issued
FROM PRODUCTDETAIL t
WHERE t.active = 1
GROUP BY t.produce_code
Andere Tipps
Gruppieren Sie einfach in der Abfrage und verwenden Sie einen inneren Join
SELECT a.product_code, b.received, b.issued
FROM productinfo a
INNER JOIN
(SELECT product_code, SUM(qty_received) AS received, SUM(qty_issued) AS issued
FROM productdetail
WHERE active = 1
GROUP BY product_code) b on b.product_code = a.product_code