Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как выбрать неповторяющиеся значения из двух таблиц?  [new]
Сергей1075
Member

Откуда:
Сообщений: 8
Есть две таблицы А и В с общим id. Нужно выбрать из В записи не равные записям в таблице А, т.е А.id<>B.id.
17 окт 12, 13:32    [13333335]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать неповторяющиеся значения из двух таблиц?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
not exists
17 окт 12, 13:34    [13333365]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать неповторяющиеся значения из двух таблиц?  [new]
Добрый Э - Эх
Guest
NOT EXISTS | NOT IN | LEFT [anti] JOIN
17 окт 12, 13:36    [13333395]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать неповторяющиеся значения из двух таблиц?  [new]
Сергей1075
Member

Откуда:
Сообщений: 8
те.
select * from B where id not in A ?
17 окт 12, 13:41    [13333464]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать неповторяющиеся значения из двух таблиц?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Сергей1075
те.
select * from B where id not in A ?
Т.е. нужно открыть хелп, и посмотреть синтаксис и примеры.
17 окт 12, 13:43    [13333490]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать неповторяющиеся значения из двух таблиц?  [new]
Сергей1075
Member

Откуда:
Сообщений: 8
посмотрел. Кажется так select * from B where id not in A.id но до конца не уверен.
17 окт 12, 13:53    [13333642]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать неповторяющиеся значения из двух таблиц?  [new]
Добрый Э - Эх
Guest
Сергей1075
посмотрел. Кажется так select * from B where id not in A.id но до конца не уверен.
плохо смотрел. смотри внимательнее...
все необходимые ключевые слова для поиска тебе дали...
17 окт 12, 13:59    [13333723]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать неповторяющиеся значения из двух таблиц?  [new]
densq
Member

Откуда:
Сообщений: 5
а вот как быстрее будет?
SELECT * FROM B
    WHERE
        not exists (SELECT 1 FROM A WHERE A.id = B.id)

или
SELECT * FROM B
    WHERE
        B.id not in (SELECT id FROM A)

или нет разницы?
или есть какие-то менее ресурсоёмкие варианты?
14 дек 12, 15:29    [13632665]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать неповторяющиеся значения из двух таблиц?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
densq,

Разница есть. Сравните результаты ваших запросов на таком наборе данных:

DECLARE @A TABLE (id INT);
DECLARE @B TABLE (id INT);

INSERT @A VALUES(1);

INSERT @B VALUES(2);
INSERT @B VALUES(NULL);

SELECT * FROM @B b
    WHERE
        not exists (SELECT 1 FROM @A a WHERE a.id = b.id)
 
SELECT * FROM @B b
    WHERE
        b.id not in (SELECT id FROM @A)

или на таком:
DECLARE @A TABLE (id INT);
DECLARE @B TABLE (id INT);

INSERT @A VALUES(1);
INSERT @A VALUES(NULL);

INSERT @B VALUES(2);

SELECT * FROM @B b
    WHERE
        not exists (SELECT 1 FROM @A a WHERE a.id = b.id)
 
SELECT * FROM @B b
    WHERE
        b.id not in (SELECT id FROM @A)
14 дек 12, 15:50    [13632813]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать неповторяющиеся значения из двух таблиц?  [new]
densq
Member

Откуда:
Сообщений: 5
2 Гость333,

спасибо
Но обычно в поле id (идентификатор) не записывают NULL, поэтому я не заострял на этом внимание (считал это само собой разумеющимся). Виноват.
В своём вопросе меня интересует именно скорость работы при достаточно больших объёмах выборок.
В принципе большая часть людей склоняется, что через exists будет быстрее (например, вот тут). Но тогда я не понимаю смысла вводить в SQL операторы in, any и т.п. Ведь exists более универсален и в тоже время быстрее.
14 дек 12, 16:02    [13632965]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать неповторяющиеся значения из двух таблиц?  [new]
P-032
Member

Откуда:
Сообщений: 11
А почему

SELECT * FROM @B b
    WHERE
        b.id not in (SELECT id FROM @A)


NULL не выдает, а выдет только 2 ? Просвятите.
14 дек 12, 19:07    [13634397]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать неповторяющиеся значения из двух таблиц?  [new]
aleks2
Guest
select * from B
except
select * from A

обрабатывает NULL "правильно".
15 дек 12, 08:12    [13635768]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать неповторяющиеся значения из двух таблиц?  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
P-032
А почему

SELECT * FROM @B b
    WHERE
        b.id not in (SELECT id FROM @A)


NULL не выдает, а выдет только 2 ? Просвятите.
To NULL or NOT to NULL? К вопросу о троичной логике
15 дек 12, 10:08    [13635843]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить