SELECT UNION as DISTINCT

Как выполнить операцию DISTINCT в одном столбце после выполнения UNION?

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

Насколько я могу судить, там нет "one-column 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, но это запрос, который возвращает то, что показано в примере.

Ответ 2

Почему вы используете подзапрос? Это будет работать:

SELECT * FROM T1
UNION
SELECT * FROM T2

UNION удаляет дубликаты. (UNION ALL не)

Ответ 3

Я думаю, что вы имели в виду:

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

Ответ 4

Это - хотя этот поток старенький - может быть рабочим решением для вопроса OP, хотя он может считаться грязным.

Мы выбираем все кортежи из первой таблицы, затем добавляет (объединяет) его с кортежами из второй таблицы, ограниченной теми, у которых нет определенного поля, сопоставленного в первой таблице.

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