удалить дубликаты из sql union - PullRequest
53 голосов
/ 08 ноября 2010

Я делаю некоторые базовые 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

Ответы [ 6 ]

150 голосов
/ 08 ноября 2010

Union удалит дубликаты.Union All нет.

5 голосов
/ 08 ноября 2010

Использование UNION автоматически удаляет повторяющиеся строки, если вы не укажете UNION ALL: http://msdn.microsoft.com/en-us/library/ms180026(SQL.90).aspx

4 голосов
/ 08 ноября 2010

Другие уже ответили на ваш прямой вопрос, но, возможно, вы могли бы упростить запрос, чтобы устранить вопрос (или я что-то пропустил, и запрос, подобный следующему, действительно даст существенно другие результаты?):

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
2 голосов
/ 08 ноября 2010

Если вы используете 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
1 голос
/ 08 ноября 2010

Поскольку вы все еще получаете дубликаты, используя только UNION, я бы проверил, что:

  • То, что они являются точными дубликатами. Я имею в виду, если вы сделаете

    SELECT DISTINCT * FROM (<your query>) AS subquery

    вы получаете меньше файлов?

  • что у вас еще нет дубликатов в первой части запроса (может быть, сгенерировано левым соединением). Насколько я понимаю, UNION это не добавит к уже набранным строкам набора результатов, но не удалит дубликаты, уже присутствующие в первом наборе данных.

0 голосов
/ 21 июня 2019

Если вы используете T-SQL, вы можете использовать временную таблицу в хранимой процедуре и соответственно обновлять или вставлять записи вашего запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...