Ответ 1
Union
удалит дубликаты. Union All
не работает.
Я делаю базовый sql на нескольких таблицах, которые у меня есть, используя объединение (правильно или неправильно)
но мне нужно удалить дубликаты. Любые идеи?
select * from calls
left join users a on calls.assigned_to= a.user_id
where a.dept = 4
union
select * from calls
left join users r on calls.requestor_id= r.user_id
where r.dept = 4
Union
удалит дубликаты. Union All
не работает.
Использование UNION
автоматически удаляет повторяющиеся строки, если вы не укажете UNION ALL
: http://msdn.microsoft.com/en-us/library/ms180026(SQL.90).aspx
Другие уже ответили на ваш прямой вопрос, но, возможно, вы могли бы упростить запрос, чтобы устранить вопрос (или я что-то пропустил, и такой запрос, как следующий, действительно приведет к существенно другим результатам?):
select *
from calls c join users u
on c.assigned_to = u.user_id
or c.requestor_id = u.user_id
where u.dept = 4
Если вы используете T-SQL, то из предыдущих сообщений появляется, что UNION удаляет дубликаты. Но если вы этого не сделаете, вы можете использовать разные. Мне это тоже не совсем нравится, но это может привести к тому, что вы ищете
SELECT DISTINCT *
FROM
(
select * from calls
left join users a on calls.assigned_to= a.user_id
where a.dept = 4
union
select * from calls
left join users r on calls.requestor_id= r.user_id
where r.dept = 4
)a
Поскольку вы все еще получаете дубликат, используя только UNION
, я бы проверял, что:
То, что они являются точными дубликатами. Я имею в виду, если вы сделаете
SELECT DISTINCT * FROM (<your query>) AS subquery
у вас меньше файлов?
То, что у вас уже нет дубликатов в первой части запроса (возможно, сгенерировано левым соединением). Как я понимаю, UNION
он не добавит к ним строки результатов, которые уже находятся на нем, но не удалит дубликаты, уже присутствующие в первом наборе данных.
Если вы используете T-SQL, вы можете использовать временную таблицу в хранимой процедуре и соответственно обновлять или вставлять записи вашего запроса.