私は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を使用しています)
@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 ブログに感謝します。
これを行いたい:
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
に変更します。
したがって、私が提案したコードに変更すると、1
と2
の両方を(a
とb
の両方から)取得し始めることに気づきます。その場合、提案されたコードを次のように変更できます。
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
@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)
説明:
これにより、テーブルbにテーブルaよりも多くの要素または異なる要素がある場合でも、すべてのケースが解決されます。
@エイドリアンの答えは完全に適切です、私はちょうど同じ結果を達成する別の方法を共有したかったです:
select nvl(a.id, b.id)
from a full outer join b on a.id = b.id
order by b.id;
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;