UNIONが実行された後、単一の列でDISTINCT操作を実行するにはどうすればよいですか?
T1
--
ID Value
1 1
2 2
3 3
T2
--
ID Value
1 2
4 4
5 5
テーブルを返そうとしています:
ID Value
1 1
2 2
3 3
4 4
5 5
私は試した:
SELECT DISTINCT ID, Value
FROM (SELECT*FROM T1 UNION SELECT*FROM T2) AS T3
これは機能していないようです。
私の言う限りでは、「1列のdistinct
」はありません。distinct
は常にレコード全体に適用されます(count(distinct name)
のような集計内で使用する場合を除く)。これは、SQLがValue
のどの値を残すか、およびどれを削除するかを推測できないためです。それはあなたが自分で定義する必要があるものです。
GROUP BY
を使用して、ID
が繰り返されないようにし、MIN
の特定の値を選択するための集計(ここでは、例ではValue
が最小でした)を使用してみます。
SELECT ID, min(Value) FROM (SELECT * FROM T1 UNION ALL SELECT * FROM T2) AS T3
GROUP BY ID
まさにあなたが必要とするものでなければなりません。つまり、同じクエリではなく、distinct
もありませんが、例に示されているものを返すクエリです。
なぜサブクエリを使用しているのですか?これは動作します:
SELECT * FROM T1
UNION
SELECT * FROM T2
UNION
は重複を削除します。 (UNION ALL
ではない)
私はそれがあなたが意味したことだと思います:
SELECT *
FROM T1
UNION
SELECT *
FROM T2
WHERE (
**ID
** NOT IN (SELECT ID FROM T1)
);
これは、たとえこのスレッドが古くても、ダーティだと見なされていても、OPの問題の解決策になる可能性があります。
最初のテーブルからすべてのタプルを選択し、2番目のテーブルからのタプルを追加(結合)して、最初のテーブルで特定のフィールドが一致しないものに限定します。
SELECT *
FROM T1
UNION
SELECT *
FROM T2
WHERE (
Value NOT IN (SELECT Value FROM T1)
);