SELECT * from table1 where column1 IN (SELECT column1 from table1 ORDER BY column1);
3 に答える
演算子order by
で使用されるクエリで句を使用することはできません。in
その使用を拒否する理由は、それが無意味だからだと推測していin
ます。結果の相対的な位置に関係なく、左側のオペランドが右側のクエリの結果に存在する場合、条件は true を返す必要があります。そのため、そこで句を使用できるようにすると、order by
Oracle の開発者は次の 2 つの魅力のない選択肢のいずれかを選択することになります。
- コストのかかる、役に立たない、並べ替え、または
order by
条項を黙って無視します。
これらのオプションはいずれも Oracle Database の考え方にうまく適合しないため、このオプションをブロックするのが最も簡単な方法だと思います。
シンプルで率直な答えNO . なんで?の目的はorder by
、結果データにソート機能を提供することであり、サブクエリ/内部クエリデータは最終出力ではなく、外部クエリを使用してさらに操作される部分データであるためorder by
、サブクエリを使用することはまったく意味がなく、非論理的です完全に。むしろ、メインクエリで次のように注文する必要があります
SELECT * from table1
where column1 IN (SELECT column1 from table1)
ORDER BY column1;
ORDER BY を使用できるかどうかという質問の場合、答えは非常に簡単です。Oracle 構文チェックは、ORDER BY を受け入れるか拒否します。
あなたの例では
SELECT * from tab1 where col1 IN (SELECT col1 from tab1 ORDER BY col1);
エラーが発生します
ORA-00907: missing right parenthesis
構文チェッカーは、サブクエリで ORDER BY を受け入れず、閉じ括弧の欠落に関する苦情を受け入れません。テーブルが存在しない場合でもまったく同じエラーが発生するという事実に見られるのは、構文チェックです。(場合によっては、許可されている構文が標準の拡張であることに注意してください)。
ORDER BY を使用する必要があるかどうかという質問は完全に異なり、他の場所で説明されているように指摘されています。
追加の例
これは、サブクエリで ORDER BY が許可されている例です
WITH t AS
(SELECT col1 FROM tab ORDER BY col1
)
SELECT * FROM t;
逆に、これは構文エラーにつながります
WITH t AS
( SELECT col1 FROM tab ORDER BY col1
UNION ALL
SELECT col1 FROM tab ORDER BY col1
)
SELECT * FROM t;