Оптимизация оператора SQL для использования запроса, но необходимо как-то ссылаться на столбец вне подзапроса - PullRequest
1 голос
/ 01 февраля 2011

Есть ли способ в Oracle в запросе SQL ссылаться на столбец из подзапроса, который находится за его пределами, или достичь этого эффекта, даже если с помощью другого средства?Все, что я читал в Интернете до сих пор, просто не помогло с этим.

Например (я так хочу):

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

У меня естьпробовал загружать различные варианты / комбинации. В настоящее время я просто получаю ошибки, такие как ORA-00904: неверный идентификатор, относящийся к отношению предложения WHERE.

В настоящее время, если я выполняю отдельные запросы, например:

SELECT product_code FROM productinfo;

, а затем для каждой из этих записей:

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

Это может занять более получаса, чтобы запустить 8000 записей, что просто глупо.

Исчезли волосы,любая помощь приветствуется!Спасибо.

Ответы [ 2 ]

6 голосов
/ 01 февраля 2011

Ошибка 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

Если вы хотите просмотреть список записей 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

Но пример выглядит так, что вам может понадобиться только:

 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
0 голосов
/ 01 февраля 2011

Просто сгруппируйте внутри запроса и используйте внутреннее объединение

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
...