web-dev-qa-db-ja.com

UNIONをDISTINCTとして選択

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

これは機能していないようです。

13
user1124535

私の言う限りでは、「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もありませんが、例に示されているものを返すクエリです。

15
alf

なぜサブクエリを使用しているのですか?これは動作します:

SELECT * FROM T1
UNION
SELECT * FROM T2

UNIONは重複を削除します。 (UNION ALL ではない)

33
Bohemian

私はそれがあなたが意味したことだと思います:

SELECT * 
  FROM T1
UNION
SELECT * 
  FROM T2 
  WHERE (
    **ID
** NOT IN (SELECT ID FROM T1)
  );
3
KT8

これは、たとえこのスレッドが古くても、ダーティだと見なされていても、OPの問題の解決策になる可能性があります。

最初のテーブルからすべてのタプルを選択し、2番目のテーブルからのタプルを追加(結合)して、最初のテーブルで特定のフィールドが一致しないものに限定します。

SELECT * 
  FROM T1
UNION
SELECT * 
  FROM T2 
  WHERE (
    Value NOT IN (SELECT Value FROM T1)
  );
3
liselorev