|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Добрый день. Есть две таблички, связанные как M-D: City / город и Street / Улица Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Нужно показать улицы, длина которых больше 100 метров. Вопрос: 1. Как идеологически более верно: Код: sql 1. 2. 3. 4.
или Код: sql 1. 2. 3. 4.
? 2. И почему. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 13:22 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
22.11.2017 13:22, Скоро пятница пишет: > И почему. никогда не смотри планы и статистику выполнения запросов. сохраняй интригу. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 13:26 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Мимопроходящий22.11.2017 13:22, Скоро пятница пишет: > И почему. никогда не смотри планы и статистику выполнения запросов. сохраняй интригу. Одинаковые. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 13:30 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
ИМХО, второй вариант идеологически неверен тем что условие отбора засунуто в условие джойна. Лучше не смешивать эти понятия в одну кучу без особой нужды. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 13:31 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Скоро пятница> 2. E ii?aio. Никаких жестких общих правил нет. Общая рекомендация - в join писать то, что соединяет соотв. таблицы, а всё остальное - фильтры - в where. Это когда join inner, конечно, с left всё работает иначе. А планы, если будут отличаться, - можно и нужно "настраивать". Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 13:33 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
fraksИМХО, второй вариант идеологически неверен тем что условие отбора засунуто в условие джойна. Лучше не смешивать эти понятия в одну кучу без особой нужды.Скоро пятница... 2. И почему. ... Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 13:34 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Скоро пятница, ответ - нет. идеологически более верно в on писать именно условие объединения, а в where - условия фильтрации получаемого результата. см. http://www.ibase.ru/joins/ раздел "Отличие между On и Where" и дальше в разделе "Left/Right Join" в качестве дополнительного примера можно привести запрос Код: sql 1. 2. 3.
мы не можем включить where o.id is null в on, потому что это не является условием объединения, и вообще записей с o.c_id is null в таблице orders не существует. Но эти записи возникают в результате работы left join. В разделе "Left/right join" есть обратный пример, когда ошибочный вынос условия ON в where меняет результат запроса. В общем, on и where - это не одно и то же. Если для inner join результат не отличается, то для left/right join - разница есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 13:36 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам... Общая рекомендация - в join писать то, что соединяет соотв. таблицы, а всё остальное - фильтры - в where. ... Что за рекомендация, чья(откуда)? Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 13:37 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Скоро пятница> Что за рекомендация, чья(откуда)? А, трололо... Вовка, ты что ли опять проказничаешь? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 13:38 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
kdv, да, именно с inner. Исключительно для inner случая вопрос был. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 13:38 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Скоро пятницаЧто за рекомендация, чья(откуда)? вопрос странный. рекомендация обусловлена синтаксисом. Если вы пытаетесь схитрить, то обманете сами себя - например, привыкнете для inner join втыкать where в условие on, а потом напоретесь на то, что в left join получите "не тот" результат. Ну или тот, кто будет читать ваши запросы, будет долго думать, какого хрена в on написано то, что должно быть в where. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 13:40 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
kdvСкоро пятницаЧто за рекомендация, чья(откуда)? вопрос странный. рекомендация обусловлена синтаксисом. Если вы пытаетесь схитрить, то обманете сами себя - например, привыкнете для inner join втыкать where в условие on, а потом напоретесь на то, что в left join получите "не тот" результат. Ну или тот, кто будет читать ваши запросы, будет долго думать, какого хрена в on написано то, что должно быть в where. Понятно. Первая причина: если впоследствии придется изменить inner на другой - фигня может получиться, которую сразу и не заметишь. Вторая: так не делают. Большое спасибо, ваш ответ меня полностью устроил. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 13:42 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
не майся сомненьями. пиши без джойна. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 14:06 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Хороший лозунг. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 15:01 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
kdvЕсли вы пытаетесь схитрить, то обманете сами себя - например, привыкнете для inner join втыкать where в условие on, а потом напоретесь на то, что в left join получите "не тот" результат.А о каком случае "напоретесь" (кроме null / not null, которые пишутся изначально только под outer join) ты говоришь? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 15:05 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
WildSery> А о каком случае "напоретесь" (кроме null / not null Зависит от того, откуда куда переносить и от того, на что и как фильтр накладывается. Если из left-джойна в where, то выборка может сильно сократиться. Если наоборот, то выборка может наоборот увеличиться, с теми самыми null-ами (а таблиц-то больше дувх в запросе может быть). Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 15:21 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
WildSeryА о каком случае "напоретесь" у меня в статье этот случай прописан. пример - дата по заказам в on и where. Но это опять же по правой части left join. Для меня, собственно, этот вопрос не существует. ON это условие объединения двух таблиц. То есть столбец из таблицы А и столбец из таблицы Б. WHERE - это условие фильтрации по столбцам одной из таблиц. Да, в ON можно добавить условие по одному из столбцов чтобы ОГРАНИЧИТЬ записи, по которым делается join, в дополнение к объединению по "столбец из А и столбец из Б". То есть, у меня в голове множества до join и после не являются одним и тем же, даже если бы результат их объединения и фильтрации был одинаковым. :-) A join B on a.id = b.a_id and a.id > 10 это последовательно: - ограничение множества A -> множество А штрих. - объединение множества А штрих и множества Б Сейчас это заменяется на (select from A where a.id > 10) join B on a.id = b.a_id здесь A join B on a.id = b.a_id where a.id > 10 последовательно - объединение множеств А и Б - результат = множество С - применение фильтра над множеством С и мне пофиг, как оно оптимизатором выполняется. Результат должен быть такой, как у указанных операций над множествами в соответствии с последовательностью операции. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 15:54 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
kdv> A join B on a.id = b.a_id and a.id > 10 Это какой-то маразматический пример. Обычно в ON если и пихают доп.фильтры, то на detail-таблицу, а не мастер-таблицу. > A join B on a.id = b.a_id > where a.id > 10 > > последовательно > - объединение множеств А и Б - результат = множество С > - применение фильтра над множеством С > > и мне пофиг, как оно оптимизатором выполняется. +1 Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 16:19 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
На всякий случай, ещё раз процитирую тебя: kdvпривыкнете для inner join втыкать where в условие on , а потом напоретесь Так на что же я могу напороться? ЗЫ. Я нередко условия для присоединяемой таблицы пишу в ON, поскольку в многоэтажном WHERE часто разобраться значительно сложнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 16:37 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
WildSery> На всякий случай, ещё раз процитирую тебя: Ты как-то избирательно цитируешь, тогда уж полностью цитируй: например, привыкнете для inner join втыкать where в условие on, а потом напоретесь на то, что в left join получите "не тот" результат. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 16:41 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам, Полностью я процитировал до этого, но Дмитрий вопрос не понял. И ты, похоже, тоже не вникал. Спрашиваю ещё раз. В каком случае, кроме одного-единственного, для поиска (не)найденных строк, я могу на что-то "напороться", если условия пишу в ON? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 18:36 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
WildSery> кроме одного-единственного, для поиска (не)найденных строк Не понял. Если фильтр на левую таблицу перенести в ON - это один случай. Если фильтр на правую таблицу перенести в ON - это второй случай. Разумеется, если множеств (таблиц) больше двух, то и вариантов их пересечений и результатов становится больше. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 19:11 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
В современных условиях наверное действительно лучше стремиться к канонической форме хотя бы для читабельности, но в 1-1.5 оптимизатор порой более уверенно обращался с индексами когда условие было в ON. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 19:56 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
Гаджимурадов РустамРазумеется, если множеств (таблиц) больше двух, то и вариантов их пересечений и результатов становится больше. не-а. джойны все равно попарно выполняются (обрабатываются). в inner пары могут образовываться в зависимости от кардинальности (типа A + (B+C) или (A+B) +C и т.д.), а в left/right они образуются жестко в порядке следования. Ну и еще, a right join b преобразуется оптимизатором в b left join a. Так что, вариантов пересечения там больше не образуется, т.к. их последовательность по большей части фиксированная. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 19:56 |
|
Пихать ли в join все, что можно?
|
|||
---|---|---|---|
#18+
kdv> Так что, вариантов пересечения там больше не образуется, kdv> т.к. их последовательность по большей части фиксированная. Ну ты мне ещё про транзитивность расскажи. :) Больше - потому что изменения результата предыдущего соединения может повлиять на следующее, хотя казалось бы его не трогает. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2017, 20:10 |
|
|
start [/forum/topic.php?fid=40&msg=39557479&tid=1561326]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
60ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 158ms |
0 / 0 |