Выборка из табл исключая данные др табл

Запросы, планы, оптимизация запросов, ...

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

Ответить
Sparton
Сообщения: 28
Зарегистрирован: 22 фев 2007, 10:38

Выборка из табл исключая данные др табл

Сообщение Sparton » 20 авг 2007, 15:15

Помогите с запросом...
Выбрать из 1 таблицы данные только те, которых нет во 2 табл.

первая табл user (id, name)
вторая табл adress (id, id_user, adr)

Как вынуть id user-ов, которых нет во второй табл?

Kotъ-Begemotъ
Сообщения: 250
Зарегистрирован: 25 июл 2007, 21:33

Re: Выборка из табл исключая данные др табл

Сообщение Kotъ-Begemotъ » 20 авг 2007, 15:46

Sparton писал(а):Помогите с запросом...
Выбрать из 1 таблицы данные только те, которых нет во 2 табл.

первая табл user (id, name)
вторая табл adress (id, id_user, adr)

Как вынуть id user-ов, которых нет во второй табл?
Чет не понял. А в чём проблема?

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

select * from Table1
where not id in
(select id from Table2)

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

Сообщение WildSery » 20 авг 2007, 16:01

Где всех учат плохому, "in (select)", "not in (select)"... :?
Есть хорошая штука exists, типа

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

select * from Table1
  where not exists (select id from Table2 where Table1.id = id)

Kotъ-Begemotъ
Сообщения: 250
Зарегистрирован: 25 июл 2007, 21:33

Сообщение Kotъ-Begemotъ » 20 авг 2007, 16:05

WildSery писал(а):Где всех учат плохому, "in (select)", "not in (select)"... :?
Есть хорошая штука exists, типа

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

select * from Table1
  where not exists (select id from Table2 where Table1.id = id)
Хм... Согласен что можно сделать и так. А в чём различие? Все равно ведь подзапрос выполняется сначала, а потом вхождения ищутся? Есть принципиальные отличия кроме синтаксиса?

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

Сообщение WildSery » 20 авг 2007, 16:26

Отличие появилось в FB 2-ке и выше, ранее оптимизатор запросы с IN заменял на EXISTS сам, а теперь такие запросы выполняются через derived tables.
Время выполнения может отличаться на порядки, в зависимости от данных.

Sparton
Сообщения: 28
Зарегистрирован: 22 фев 2007, 10:38

Сообщение Sparton » 20 авг 2007, 17:06

WildSery писал(а): через derived tables.
Спасибо за подсказки, работает. Скоро будем ставить 2.0, как там использовать derived tables? Если быстрее работать будет.

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

Сообщение WildSery » 20 авг 2007, 18:15

В этом конкретном, скорее всего, напоретесь на жуткий тормоз, если через IN написано, по сравнению с EXISTS.
При переходе на 2-ку все подзапросы через IN необходимо шерстить и проверять. А лучше сразу так не писать :)

Heimdallr
Сообщения: 6
Зарегистрирован: 03 авг 2005, 09:28

Сообщение Heimdallr » 29 авг 2007, 08:19

А так разве не классика жанра:

select u.* from user u
left join adress a on a.id_user=u.id
where a.id is null

Или подзапрос с exists все-таки лучше?

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

Сообщение WildSery » 29 авг 2007, 11:07

Heimdallr писал(а):А так разве не классика жанра:
Это классика для систем, не поддерживающих подзапросы, например 1С.
Heimdallr писал(а):Или подзапрос с exists все-таки лучше?
Практически одинаково, но скорость exist >= скорости left join.
Как правило, равны, но бывают исключения.

У меня была ещё ситуация наоборот, когда left быстрее отрабатывал, но сейчас я её не помню, и потому склонен к мнению, что это у меня был глюк или неправильно что-то сравнивал.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 29 авг 2007, 13:40

WildSery писал(а): У меня была ещё ситуация наоборот, когда left быстрее отрабатывал, но сейчас я её не помню, и потому склонен к мнению, что это у меня был глюк или неправильно что-то сравнивал.
Зависит от характера самих данных. В смысле соотношения случаев екзист и не екзист.

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

Сообщение WildSery » 29 авг 2007, 16:58

Merlin писал(а):Зависит от характера самих данных.
А какое соотношение должно быть, не помнишь?
Чего-то попробовал на скорую руку - не получилось, чтобы left был быстрее.

Ответить