Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
 Вопрос по логике работы  [new]
sergq
Member

Откуда:
Сообщений: 655
Здравствуйте.

допустим есть такой запрос

select NEW_TABLE4.S, NEW_TABLE4.CH,  NEW_TABLE4.j, NEW_TABLE5.DDD from NEW_TABLE4
left join NEW_TABLE5 on NEW_TABLE5.c = NEW_TABLE4.j
where NEW_TABLE4.s = 333
and  NEW_TABLE5.ddd = 55555


по логике (хотя могу ошибаться) создается поток выборки из NEW_TABLE4, идет выборка из него и сразу можно фильтровать по NEW_TABLE4.s = 333. Ширина потока выходного будет 3 поля

потом к выходу этого потока идет join NEW_TABLE5. ну и если нашли по условию соединения что то в new_table5 - получаем значение поля DDD и расширяем выходной поток на 1 поле. А вот когда применяется последнее условие? чисто теоретически его можно применить на выходе из потока, который джойнит new_table5. и вроде все будет ок.
Но как тогда сервер внутри поведет себя, если условие будет OR NEW_TABLE5.ddd = 55555.

Смысла такого условия вроде как нет. в результате будет выдано все, что есть в new_table4. и вроде как вне зависимости от того, как прошел join. Но как внутри сервера такое условие обрабатывается?
10 фев 19, 02:57    [21805517]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по логике работы  [new]
sergq
Member

Откуда:
Сообщений: 655
и такой вопрос.
для понимания.

запрос.
select S, CH,DDD from NEW_TABLE4
left join NEW_TABLE5 on NEW_TABLE5.c = NEW_TABLE4.j and NEW_TABLE5.ddd = 55555
where NEW_TABLE4.s = 333


чем он отличатся от первого? первый в итоге выдаст все, что приджойнено и and NEW_TABLE5.ddd = 55555

а вот этот запрос так же выдает все, что есть в new_table, но там, где and NEW_TABLE5.ddd <> 55555 там DDD = null


Может до утра и созрею, но хотелось бы услышать мнение знающих )
10 фев 19, 03:03    [21805519]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по логике работы  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 27948
sergq,

работает так.
поскольку NEW_TABLE4 left join NEW_TABLE5
множество записей из new_table4 будет взято целиком. А записи из new_table5 будут браться в соответствии с этими записями, поиском по соответствующему индексу на new_table5 по условию join.
Дальше, данные будут отфильтрованы по where, как по условию new_table4, так и по условию new_table5.
Если что-то можно "продвинуть" внутрь join, оно продвинется.
http://www.ibase.ru/joins/
http://www.ibase.ru/dataaccesspaths/

"расширяем поток", "на выходе из потока" - не надо всякую муть сочинять. Есть множества, они объединяются конкретным образом. Волшебных образов для объединения множеств нет.
sergq
если условие будет OR NEW_TABLE5.ddd = 55555.

если есть индекс по столбцу ddd, тогда будет слияние битовой маски выборки по NEW_TABLE5 по OR, если там есть другие условия по другим индексам. Если нет индекса по ddd, тогда будет просто фильтрация по мере выборки записей.
Еще раз - держите в голове просто множества, и операции над ними. Магии нет.
10 фев 19, 03:10    [21805520]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по логике работы  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 27948
sergq,
см.
http://www.ibase.ru/joins/
там такой пример есть.
10 фев 19, 03:11    [21805521]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по логике работы  [new]
Vlad F
Member

Откуда:
Сообщений: 787
sergq
и такой вопрос.
для понимания.

запрос.
select S, CH,DDD from NEW_TABLE4
left join NEW_TABLE5 on NEW_TABLE5.c = NEW_TABLE4.j and NEW_TABLE5.ddd = 55555
where NEW_TABLE4.s = 333


чем он отличатся от первого? первый в итоге выдаст все, что приджойнено и and NEW_TABLE5.ddd = 55555

а вот этот запрос так же выдает все, что есть в new_table, но там, где and NEW_TABLE5.ddd <> 55555 там DDD = null

Выдаст все из опорной таблицы по условию where. Остальное все в принципе верно.
10 фев 19, 09:58    [21805561]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по логике работы  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 47399

sergq
чем он отличатся от первого?

Первый запрос совершенно бестолков, второй уже имеет смысл и написавшему можно не отрывать
руки. Подробности у kdv.

Posted via ActualForum NNTP Server 1.5

10 фев 19, 13:39    [21805636]     Ответить | Цитировать Сообщить модератору
Все форумы / Firebird, InterBase Ответить