2011-10-08 1 views
5

ORDER BYにはMINUSというクエリの結果が必要です。MINUSを使用したクエリでは、どのようにORDER BYを使用しますか?

私の最初の試みは動作しません:

SELECT * 
FROM Table1 
MINUS 
SELECT * 
FROM table2 
WHERE table2.foo = 'bar' 
ORDER BY foo 

あなたはそれをどうしますか?

おっと:私はORDER BY table2.fooを行うだけではなくORDER BY fooました。今それは動作します。

+0

どちらも同じ表ですね。なぜマイナスを使うのですか? – frail

+0

申し訳ありませんが、悪い例です。私はそれを変更しました – ladookie

+0

基本的に高価な操作は、完全なテーブルスキャンが必要です。もしあなたがいくつかの例のデータを投稿できるのであれば、それは結合で解くことができるかもしれません(データに依存します)そしてあなたはすべてのデータを必要としますか?フルテーブルスキャンを避けることができる制限がありますか? – frail

答えて

8

しかし、あなたの質問に答えるために、クエリで使用することができます。

with tmp_minus as (
    SELECT * 
    FROM Table1 
    MINUS 
    SELECT * 
    FROM table2 
    WHERE table2.foo = 'bar' 
) 
select * from tmp_minus 
ORDER BY foo 

あなたはまた、副選択を行うことができるはずです:MINUSは、UNIONに置き換えた場合

select * from (
    SELECT * 
    FROM Table1 
    MINUS 
    SELECT * 
    FROM table2 
    WHERE table2.foo = 'bar' 
) tmp_minus 
ORDER BY foo 
1

を、 ORDER BYはUNIONの結果に適用されます。あなたはMINUSのものではないと確信していますか?

それが直接動作しない場合は、:

SELECT result.* 
    FROM (SELECT * 
      FROM Table1 
     MINUS 
     SELECT * 
      FROM table2 
     WHERE table2.foo = 'bar') AS result 
ORDER BY foo; 

はしかし、私は、これは必要なさそうだと思います。

1

列名の代わりに位置を使用できます。そのFOOと仮定すると結果の最初の列です:

SELECT * 
FROM Table1 
MINUS 
SELECT * 
FROM table2 
WHERE table2.foo = 'bar' 
ORDER BY 1 

あなたは、通常の結果は、特定の列の順序に依存したくないので、私は唯一のアドホッククエリのためにこれを使用します。

関連する問題