Страница 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, но это оказалось не так.