Optimisation de l'instruction SQL pour utiliser la requête, mais besoin de colonne référence sous-requête en dehors d'une certaine manière
-
28-10-2019 - |
Question
Est-il possible d'Oracle dans une requête SQL pour référencer une colonne à partir d'un sous-requête qui est en dehors de celui-ci, ou pour obtenir cet effet, même si par un autre moyen? Tout ce que je l'ai lu sur le web n'a jusqu'à présent tout simplement pas aidé à ce sujet.
Par exemple (ce qui est le genre de chose que je suis après):
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);
J'ai essayé des charges de différentes variations / combinationsAt le moment où je viens d'obtenir des erreurs comme ORA-00904:. Identifiant incorrect concernant la clause WHERE relation
À l'heure actuelle, si je cours sous forme de requêtes séparées, par exemple:.
SELECT product_code FROM productinfo;
et pour chacun de ces dossiers:
SELECT SUM(qty_received) AS received, SUM(qty_issued) AS issued FROM productdetail
WHERE product_code = '(specified)' AND active = 1;
Cela peut prendre plus d'une demi-heure à courir pour 8000 dossiers qui est juste daft ordinaire.
Manquer de cheveux, toute aide appréciée !! Merci.
La solution
L'erreur ORA est parce que vous ne pouvez pas établir une corrélation entre la table dérivée / vue en ligne -. Vous devez utiliser la notation JOIN (ANSI-89 ou 92)
En supposant que vous avez vraiment besoin colonne (s) de la table PRODUCTINFO
, utilisez:
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
Si vous voulez voir une liste des enregistrements ProductInfo, qui peuvent ou non avoir des dossiers productDetail, utilisez:
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
Mais l'exemple semble que vous pourriez seulement avoir besoin d'utiliser:
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
Autres conseils
Juste groupe par l'intérieur de la requête et utilisez une jointure
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