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)
);