web-dev-qa-db-ja.com

SQL:特定の選択でUNIONを使用して順序付ける方法

私は2つの選択があります:

SELECT id FROM a -- returns 1,4,2,3
UNION
SELECT id FROM b -- returns 2,1

1,4,2,3のような正しい行数を受信して​​います。

しかし、bテーブルの結果が最初に欲しい:2,1,4,3または2,1,3,4

これどうやってするの?

(私はOracleを使用しています)

22
Topera

@Adrianのヒントを使用して、解決策を見つけました。

私はGROUP BY[〜#〜] count [〜#〜]を使用しています。 [〜#〜] distinct [〜#〜]ORDER BYを使用しようとしましたが、エラーメッセージが表示されます。 "選択された式ではありません"

select id from 
(
    SELECT id FROM a -- returns 1,4,2,3
    UNION ALL -- changed to ALL
    SELECT id FROM b -- returns 2,1
)
GROUP BY id ORDER BY count(id);

エイドリアンと this ブログに感謝します。

5
Topera

これを行いたい:

select * from 
(
    SELECT id, 2 as ordered FROM a -- returns 1,4,2,3
    UNION
    SELECT id, 1 as ordered FROM b -- returns 2,1
)
order by ordered

更新

2つの異なるテーブルがありますが、IDを結合することに気付きました。つまり、両方のテーブルに1がある場合、1回しか発生しません。それが望ましい動作であれば、UNIONに固執する必要があります。そうでない場合は、UNION ALLに変更します。

したがって、私が提案したコードに変更すると、12の両方を(abの両方から)取得し始めることに気づきます。その場合、提案されたコードを次のように変更できます。

select distinct id from 
(
    SELECT id, 2 as ordered FROM a -- returns 1,4,2,3
    UNION
    SELECT id, 1 as ordered FROM b -- returns 2,1
)
order by ordered
28
Adrian Carneiro

@Adrienの答えはうまくいきません。 ORA-01791になります。

正しい答え(尋ねられた質問に対する)は次のようになります。

select id
from 
 (SELECT id, 2 as ordered FROM a -- returns 1,4,2,3
  UNION ALL
  SELECT id, 1 as ordered FROM b -- returns 2,1
  )
group by id
order by min(ordered)

説明:

  1. 「UNION ALL」は2つのセットを組み合わせています。順序付けられたフィールドが異なるため、2つのセットを同じにすることはできないため、「UNION」は無駄です。
  2. 「グループ化」は重複を排除します
  3. 「最小順(順序付け)」は、テーブルbの要素が最初であることを保証します

これにより、テーブルbにテーブルaよりも多くの要素または異なる要素がある場合でも、すべてのケースが解決されます。

3
rvheddeg

@エイドリアンの答えは完全に適切です、私はちょうど同じ結果を達成する別の方法を共有したかったです:

select nvl(a.id, b.id)
from a full outer join b on a.id = b.id
order by b.id;
1
Allan
SELECT id, 1 AS sort_order
  FROM b
UNION
SELECT id, 2 AS sort_order
  FROM a
MINUS
SELECT id, 2 AS sort_order
  FROM b
ORDER BY 2;
0
onedaywhen