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

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

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.

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top