SQLステートメントを最適化してクエリを使用しますが、何らかの形でサブクエリーの外で列を参照する必要があります
-
28-10-2019 - |
質問
SQLクエリ内の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);
ORA-00904のようなエラーが発生した瞬間に、さまざまなバリエーション/組み合わせを試しました。WhereClause関係に関連する無効な識別子。
現在、私が別のクエリとして実行する場合、例:
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;
これには30分以上かかり、8000のレコードを実行することができます。
髪の毛が足りなく、あらゆる助けに感謝します!!ありがとうございました。
解決
ORAエラーは、派生テーブル/インラインビューを相関させることができないためです - 参加表記(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
ProductDetail Recordsを持っている場合とない場合があるProductINFOレコードのリストを表示したい場合は、以下を使用してください。
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
他のヒント
クエリ内でグループ化するだけで、内側の結合を使用します
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
所属していません StackOverflow