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.

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top