powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как быстро выбрать всех мастеров, у которых нет деталей?
25 сообщений из 36, страница 1 из 2
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375693
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Связка мастер - деталь. В базе существуют мастера, у которых нет ни одной записи о деталях. Как быстрее всего выбрать такие записи? Связка идет по первичному ключу + внешнему. FB 2.0 и выше.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375696
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
where not exists - единственный способ.

Для дальнейшего ускорения надо менять структуру БД.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375697
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

LEFT JOIN, NOT EXISTS
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375704
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

да, спасибо. перебором только получается, так и думал.

причем не получается :) посмотрите, плиз, на запрос, что не так делаю:

Код: sql
1.
select series.series_uid from series where not exists (select images.series_uid from images)



связка идёт по полю series_uid, как понятно из запроса. не выбирается ни одна запись, хотя точно существует одна запись серий без изображений.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375710
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonсвязка идёт по полю series_uid
Не вижу в каком месте у тебя "связь идёт". Ткни пальцем на букву.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375712
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

в базе
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375713
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonсвязка идёт по полю series_uid, как понятно из запроса.
где это видно и понятно?
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375714
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

могу структуру таблиц частично выложить. там простая связь по указанным полям PK > FK.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375719
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

связи между таблицами может вообще не быть. И на запросы эта связь вообще никак не влияет.
вопрос Дениса Симонова был про запрос.

Вам надо писать
select ...
from master m left join details d
on m.id = d.m_id
where d.m_id is null

http://www.ibase.ru/joins/
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375721
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonв базе
А рация - на бронепоезде, ага...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375723
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

спасибо, получилось )

Код: sql
1.
2.
3.
select m.series_uid from series m left join images d
on m.series_uid = d.series_uid
where d.series_uid is null
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375843
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

классический вариант такой:
Код: sql
1.
select series.series_uid from series where not exists (select images.series_uid from images where images.series_uid=series.series_uid)
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375896
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

не знаю, почему он классический. Для меня классический - мой вариант, с left join.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375901
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvне знаю, почему он классический. Для меня классический - мой вариант, с left join.
Вы разных классиков читаете.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375904
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

+1
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375961
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имел ввиду классический при использовании EXISTS.
Кстати, при использовании left join в таком запросе не нарвёмся на сканирование всей таблицы деталей? Нарвёмся. И совсем это ни к чему.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375979
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIнарвёмся на сканирование всей таблицы деталей? Нарвёмся. И совсем это ни к чему.
нарвемся на сканирование всей таблицы мастера. а куда деваться?
такие запросы мне приходилось писать, когда попадались битые базы с потерянными данными в справочниках.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39375997
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIКстати, при использовании left join в таком запросе не нарвёмся на сканирование всей таблицы деталей? НарвёмсяУверен ?
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376017
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvДля меня классический - мой вариант, с left join.

Вот только при наличии большой толпы деталей к каждому мастеру, не будет ли он тормозить,
сначала выбирая каждую деталь, а только потом проверяя поле на NULL?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376047
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovсначала выбирая каждую деталь
эээ, шо? a left join b - в a будут выбраны все записи, из b будут выбраны записи по индексу.
сколько там и чего будет выбрано - абсолютно пофиг, ибо результат важнее скорости. А насчет exists - оно что, будет быстрее?
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376050
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvА насчет exists - оно что, будет быстрее?
По идее - да, поскольку остановится на первой найденной детали и даже не будет её
распаковывать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376060
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я подтверждаю (иначе писать не стал бы). При left join вся таблица деталей "фетчится". И представьте. у Вас 100 мастеров, а 50-ти выдавали детали по нескольку штук каждый рабочий день. И в запросе за год будет какое-то сумасшедшее время выполнения.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376188
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovПо идее - да
Помнится у меня join работал быстрее, хотя я ожидал быстрого exists....
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376239
Romanzek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если не ошибаюсь.
exist => nested loops (без вариантов)
join => join по индексу (если он конечно есть)

Имхо, немного разные алгоритмы. Join должен работать быстрее в большинстве случаев.
...
Рейтинг: 0 / 0
Как быстро выбрать всех мастеров, у которых нет деталей?
    #39376248
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Romanzekexist => nested loops (без вариантов)
join => join по индексу (если он конечно есть)
И?.. "Join по индексу" может выполняться как-то кроме nested loop с учётом его
outer-ности? Вы там в RB научили его использовать merge?.. Стандартный птиц не умеет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 36, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как быстро выбрать всех мастеров, у которых нет деталей?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]