0
SELECT * from table1 where column1 IN (SELECT column1 from table1 ORDER BY column1);
4

3 に答える 3

6

演算子order byで使用されるクエリで句を使用することはできません。inその使用を拒否する理由は、それが無意味だからだと推測していinます。結果の相対的な位置に関係なく、左側のオペランドが右側のクエリの結果に存在する場合、条件は true を返す必要があります。そのため、そこで句を使用できるようにすると、order byOracle の開発者は次の 2 つの魅力のない選択肢のいずれかを選択することになります。

  1. コストのかかる、役に立たない、並べ替え、または
  2. order by条項を黙って無視します。

これらのオプションはいずれも Oracle Database の考え方にうまく適合しないため、このオプションをブロックするのが最も簡単な方法だと思います。

于 2015-12-20T07:24:55.127 に答える
3

シンプルで率直な答えNO . なんで?の目的はorder by、結果データにソート機能を提供することであり、サブクエリ/内部クエリデータは最終出力ではなく、外部クエリを使用してさらに操作される部分データであるためorder by、サブクエリを使用することはまったく意味がなく、非論理的です完全に。むしろ、メインクエリで次のように注文する必要があります

SELECT * from table1 
where column1 IN (SELECT column1 from table1)
 ORDER BY column1;
于 2015-12-20T09:41:14.860 に答える
1

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;
于 2015-12-20T09:24:16.163 に答える