Страница 1 из 1

Подскажите, как выбрать записи из таблицы, которых нет во 2-

Добавлено: 31 май 2008, 18:17
anoxa
Подскажите, как выбрать записи из таблицы, которых нет во 2-ой таблице.

Т.е.:
Table1 с полями ID, Name
Table2 с полями ID2, ID

Нужно выбрать все записи таблицы Table1.ID, которых нет в Table2.ID

Добавлено: 31 май 2008, 20:43
xvv
Как вариант:
select * from table1 t1
left join table t2 on t1.id=t2.id
where t2.id is null
или через exists, но я его не люблю. Хотя то или иное решение имеют место быть в зависимости от объёма таблиц (текущего и расчётного)

Добавлено: 01 июн 2008, 16:34
Antoxa
xvv писал(а):или через exists, но я его не люблю. Хотя то или иное решение имеют место быть в зависимости от объёма таблиц (текущего и расчётного)
Интересно, а как ч-з exists? Запсией ~ 500 расчетные не более 3000

Добавлено: 01 июн 2008, 18:55
WildSery
xvv писал(а):через exists, но я его не люблю.
И зря. EXISTS в таких запросах работает лучше на любом объёме данных и при любых условиях.
Ситуация может измениться только при одном условии - если LEFT JOIN перестанет работать рекурсивным перебором.

Код: Выделить всё

select *
  from table1 t1
  where not exists (select * from table2 where id = t1.id)

Это интересно

Добавлено: 02 июн 2008, 12:51
Antoxa
И больее логично, на мой взгляд. Спасибо.

Добавлено: 02 июн 2008, 19:40
xvv
Как ни странно, но в fb2.1 exist работает неплохо.
Так что возможно мой вариант будет медленне при прочих выборках.

Добавлено: 03 июн 2008, 12:02
WildSery
xvv писал(а):Как ни странно, но в fb2.1 exist работает неплохо.
Как и на 2.0, и на 1.5, и на 1.0.
Хотелось бы поглядеть на пример, где exist будет медленнее чем left join, на любом из указанных серверов.
Хотя установленного 1.5 у меня нет, но для такого случая поставлю :)

ЗЫ: Left join я лично применяю для таких целей только в 1С. Эти лентяи до сих пор кореллирующие подзапросы не могут сделать...

Добавлено: 03 июн 2008, 13:13
Gera
Провел некоторое исследование по данному вопросу и предлагаю ознакомиться с результатами вот сдесь http://www.az-design.ru/Support/DataBas ... 0003.shtml

Добавлено: 03 июн 2008, 13:19
kdv
а чего сразу ID - bigint ? смущать неокрепшие умы?

да и вообще. "напугало неиспользование индексов".
A.ID NOT IN - здесь индекс никак
SELECT B.ID FROM B - здесь тоже индекс ни к селу ни к городу
попытка
SELECT B.ID FROM B ORDER BY B.ID - это вообще чума. order by по индексу идет по индексу и дергает записи чаще всего в "случайном" порядке с диска. Поэтому order by по индексу годится только для небольших выборок. А уж тем более здесь...

distinct - начиная с IB 6.0 также идет натуралом.

в общем, если оставить как есть, то я бы сопроводил комментариями.

Добавлено: 03 июн 2008, 13:24
Gera
Просто на рабочей базе уже один раз INT закончился :( теперь на всякий случай пишу так.

Добавлено: 03 июн 2008, 13:26
kdv
уже один раз INT закончился
ну-ка, ну-ка, поподробнее... часом, не один идентификатор для всех таблиц?

Добавлено: 03 июн 2008, 13:35
Gera
Код Счет-квитанции в едином рассчётно-кассовом центре. На самом деле проблема была в неправильном распределении диапазонов ID на филиалах при репликации средствами MSSQL.

Добавлено: 03 июн 2008, 15:09
kdv
так вот. почему я и спросил. Давайте, пока речь не идет о филиалах, указывать INT, а не BIGINT. А кому надо, потом сам разберется.

Добавлено: 03 июн 2008, 18:25
xvv
ага, я также проверил. Только меньше извращался. причём я ожидал что на примерно равных таблицах join догонит exist, но это оказалось не так.