Ottimizzazione dell'istruzione SQL per utilizzare la query ma è necessario fare riferimento alla colonna all'esterno della sottoquery in qualche modo

StackOverflow https://stackoverflow.com/questions/4866948

Domanda

Esiste un modo in Oracle all'interno di una query SQL per fare riferimento a una colonna all'interno di una sottoquery che si trova al di fuori di essa o per ottenere quell'effetto anche se tramite un mezzo diverso? Tutto ciò che ho letto sul web finora non ha solo aiutato in questo.

Ad esempio (questo è il genere di cose che sto cercando):

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

Ho provato un sacco di diverse varianti/combinazioni nel momento in cui ricevo solo errori come ORA-00904: identificatore non valido relativo alla relazione della clausola Where.

Al momento se corro come domande separate, ad esempio:

SELECT product_code FROM productinfo;

E poi per ciascuno di questi record:

SELECT SUM(qty_received) AS received, SUM(qty_issued) AS issued FROM productdetail
WHERE product_code = '(specified)' AND active = 1;

Questo può richiedere più di mezz'ora per funzionare per 8000 record, che è semplicemente un semplice stupido.

Score di capelli, qualsiasi aiuto apprezzato !! Grazie.

È stato utile?

Soluzione

L'errore ORA è perché non è possibile correlare la tabella derivata/vista inline: è necessario utilizzare la notazione di join (ANSI -89 o 92).

Supponendo che tu abbia davvero bisogno di colonne dal PRODUCTINFO Tabella, usa:

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

Se si desidera vedere un elenco dei record productinfo, che possono o meno avere record di dati di prodotto, utilizzare:

   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

Ma l'esempio sembra che potresti dover solo usare:

 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

Altri suggerimenti

Solo raggruppa all'interno della query e usa un join interno

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top