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

Модераторы: kdv, CyberMax

Ответить
anoxa
Сообщения: 1
Зарегистрирован: 31 май 2008, 18:13

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

Сообщение anoxa » 31 май 2008, 18:17

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

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

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

xvv
Сообщения: 21
Зарегистрирован: 23 май 2008, 07:33

Сообщение xvv » 31 май 2008, 20:43

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

Antoxa
Сообщения: 169
Зарегистрирован: 06 июл 2006, 10:53

Сообщение Antoxa » 01 июн 2008, 16:34

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

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 01 июн 2008, 18:55

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

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

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

Antoxa
Сообщения: 169
Зарегистрирован: 06 июл 2006, 10:53

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

Сообщение Antoxa » 02 июн 2008, 12:51

И больее логично, на мой взгляд. Спасибо.

xvv
Сообщения: 21
Зарегистрирован: 23 май 2008, 07:33

Сообщение xvv » 02 июн 2008, 19:40

Как ни странно, но в fb2.1 exist работает неплохо.
Так что возможно мой вариант будет медленне при прочих выборках.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 03 июн 2008, 12:02

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

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

Gera
Сообщения: 53
Зарегистрирован: 12 мар 2008, 17:34

Сообщение Gera » 03 июн 2008, 13:13

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 03 июн 2008, 13:19

а чего сразу 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 также идет натуралом.

в общем, если оставить как есть, то я бы сопроводил комментариями.
Последний раз редактировалось kdv 03 июн 2008, 13:25, всего редактировалось 1 раз.

Gera
Сообщения: 53
Зарегистрирован: 12 мар 2008, 17:34

Сообщение Gera » 03 июн 2008, 13:24

Просто на рабочей базе уже один раз INT закончился :( теперь на всякий случай пишу так.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 03 июн 2008, 13:26

уже один раз INT закончился
ну-ка, ну-ка, поподробнее... часом, не один идентификатор для всех таблиц?

Gera
Сообщения: 53
Зарегистрирован: 12 мар 2008, 17:34

Сообщение Gera » 03 июн 2008, 13:35

Код Счет-квитанции в едином рассчётно-кассовом центре. На самом деле проблема была в неправильном распределении диапазонов ID на филиалах при репликации средствами MSSQL.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 03 июн 2008, 15:09

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

xvv
Сообщения: 21
Зарегистрирован: 23 май 2008, 07:33

Сообщение xvv » 03 июн 2008, 18:25

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

Ответить