Ottimizzazione dell'istruzione SQL per utilizzare la query ma è necessario fare riferimento alla colonna all'esterno della sottoquery in qualche modo
-
28-10-2019 - |
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.
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