优化SQL语句以使用查询但需要以某种方式引用子查询之外的列

ric*_*oke 1 sql oracle subquery query-optimization ora-00904

在Oracle查询中是否有任何方法可以在其外部的子查询中引用列,或者即使通过不同的方式实现该效果?到目前为止,我在网上看到的所有东西都没有帮助.

例如(这是我想要的事情):

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);
Run Code Online (Sandbox Code Playgroud)

我已经尝试了大量不同的变体/组合当我得到像ORA-00904这样的错误:与WHERE子句关系有关的无效标识符.

目前,如果我作为单独的查询运行,例如:

SELECT product_code FROM productinfo;
Run Code Online (Sandbox Code Playgroud)

然后为每个记录:

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

这可能需要半个多小时来运行8000个记录,这只是简单的愚蠢.

用完头发,任何帮助赞赏!! 谢谢.

OMG*_*ies 6

ORA错误是因为您无法关联派生表/内联视图 - 您需要使用JOIN表示法(ANSI-89或92).

假设您确实需要PRODUCTINFO表中的列,请使用:

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
Run Code Online (Sandbox Code Playgroud)

如果要查看productinfo记录列表(可能有也可能没有PRODUCTDETAIL记录),请使用:

   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
Run Code Online (Sandbox Code Playgroud)

但是示例看起来您可能只需要使用:

 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
Run Code Online (Sandbox Code Playgroud)