powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Пихать ли в join все, что можно?
25 сообщений из 39, страница 1 из 2
Пихать ли в join все, что можно?
    #39557460
Добрый день.
Есть две таблички, связанные как M-D: City / город и Street / Улица

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE CITY (
    ID         INTEGER NOT NULL,
    CITY_NAME  VARCHAR(100)
);
ALTER TABLE CITY ADD CONSTRAINT PK_CITY PRIMARY KEY (ID);

CREATE TABLE STREET (
    ID             INTEGER NOT NULL,
    STREET_NAME    VARCHAR(100),
    STREET_LENGTH  INTEGER,
    CITY_ID        INTEGER
);
ALTER TABLE STREET ADD CONSTRAINT PK_STREET PRIMARY KEY (ID);
ALTER TABLE STREET ADD CONSTRAINT FK_STREET_CITY FOREIGN KEY (CITY_ID) REFERENCES CITY (ID);

Нужно показать улицы, длина которых больше 100 метров.

Вопрос:
1. Как идеологически более верно:

Код: sql
1.
2.
3.
4.
select C.CITY_NAME, S.STREET_NAME, S.STREET_LENGTH
from STREET S
join CITY C on C.ID = S.CITY_ID
where S.STREET_LENGTH > 100


или

Код: sql
1.
2.
3.
4.
select C.CITY_NAME, S.STREET_NAME, S.STREET_LENGTH
from STREET S
join CITY C on C.ID = S.CITY_ID
           and S.STREET_LENGTH > 100


?

2. И почему.

Спасибо.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557469
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
22.11.2017 13:22, Скоро пятница пишет:
> И почему.

никогда не смотри планы и статистику выполнения запросов.
сохраняй интригу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557472
Мимопроходящий22.11.2017 13:22, Скоро пятница пишет:
> И почему.

никогда не смотри планы и статистику выполнения запросов.
сохраняй интригу.

Одинаковые. :)
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557474
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО, второй вариант идеологически неверен тем что условие отбора засунуто в условие джойна.
Лучше не смешивать эти понятия в одну кучу без особой нужды.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557479
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скоро пятница> 2. E ii?aio.

Никаких жестких общих правил нет.
Общая рекомендация - в join писать
то, что соединяет соотв. таблицы, а
всё остальное - фильтры - в where.
Это когда join inner, конечно, с left
всё работает иначе.

А планы, если будут отличаться, -
можно и нужно "настраивать".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557480
fraksИМХО, второй вариант идеологически неверен тем что условие отбора засунуто в условие джойна.
Лучше не смешивать эти понятия в одну кучу без особой нужды.Скоро пятница...
2. И почему.
...
Спасибо.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557483
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скоро пятница,

ответ - нет. идеологически более верно в on писать именно условие объединения, а в where - условия фильтрации получаемого результата.
см. http://www.ibase.ru/joins/
раздел "Отличие между On и Where" и дальше в разделе "Left/Right Join"

в качестве дополнительного примера можно привести запрос
Код: sql
1.
2.
3.
select c.id, c.name, o.id, ...
from clients c left join orders o on c.id = o.c_id
where o.id is null



мы не можем включить 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 - разница есть.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557484
Гаджимурадов Рустам...
Общая рекомендация - в join писать
то, что соединяет соотв. таблицы, а
всё остальное - фильтры - в where.
...
Что за рекомендация, чья(откуда)?

Спасибо
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557488
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скоро пятница> Что за рекомендация, чья(откуда)?

А, трололо... Вовка, ты что ли опять проказничаешь?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557490
kdv,

да, именно с inner. Исключительно для inner случая вопрос был.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557491
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скоро пятницаЧто за рекомендация, чья(откуда)?
вопрос странный. рекомендация обусловлена синтаксисом. Если вы пытаетесь схитрить, то обманете сами себя - например, привыкнете для inner join втыкать where в условие on, а потом напоретесь на то, что в left join получите "не тот" результат.
Ну или тот, кто будет читать ваши запросы, будет долго думать, какого хрена в on написано то, что должно быть в where.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557494
kdvСкоро пятницаЧто за рекомендация, чья(откуда)?
вопрос странный. рекомендация обусловлена синтаксисом. Если вы пытаетесь схитрить, то обманете сами себя - например, привыкнете для inner join втыкать where в условие on, а потом напоретесь на то, что в left join получите "не тот" результат.
Ну или тот, кто будет читать ваши запросы, будет долго думать, какого хрена в on написано то, что должно быть в where.
Понятно.

Первая причина: если впоследствии придется изменить inner на другой - фигня может получиться, которую сразу и не заметишь.
Вторая: так не делают.

Большое спасибо, ваш ответ меня полностью устроил.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557515
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не майся сомненьями.
пиши без джойна.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557561
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хороший лозунг.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557564
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvЕсли вы пытаетесь схитрить, то обманете сами себя - например, привыкнете для inner join втыкать where в условие on, а потом напоретесь на то, что в left join получите "не тот" результат.А о каком случае "напоретесь" (кроме null / not null, которые пишутся изначально только под outer join) ты говоришь?
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557582
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery> А о каком случае "напоретесь" (кроме null / not null

Зависит от того, откуда куда переносить и
от того, на что и как фильтр накладывается.
Если из left-джойна в where, то выборка
может сильно сократиться. Если наоборот,
то выборка может наоборот увеличиться, с
теми самыми null-ами (а таблиц-то больше
дувх в запросе может быть).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557617
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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

последовательно
- объединение множеств А и Б - результат = множество С
- применение фильтра над множеством С

и мне пофиг, как оно оптимизатором выполняется. Результат должен быть такой, как у указанных операций над множествами в соответствии с последовательностью операции.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557646
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557671
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На всякий случай, ещё раз процитирую тебя:
kdvпривыкнете для inner join втыкать where в условие on , а потом напоретесь
Так на что же я могу напороться?

ЗЫ. Я нередко условия для присоединяемой таблицы пишу в ON, поскольку в многоэтажном WHERE часто разобраться значительно сложнее.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557677
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery> На всякий случай, ещё раз процитирую тебя:


Ты как-то избирательно цитируешь, тогда уж полностью цитируй:

например, привыкнете для inner join втыкать where в условие on, а потом напоретесь на то, что в left join получите "не тот" результат.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557782
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

Полностью я процитировал до этого, но Дмитрий вопрос не понял.
И ты, похоже, тоже не вникал.

Спрашиваю ещё раз.
В каком случае, кроме одного-единственного, для поиска (не)найденных строк, я могу на что-то "напороться", если условия пишу в ON?
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557798
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery> кроме одного-единственного, для поиска (не)найденных строк

Не понял.

Если фильтр на левую таблицу перенести в ON - это один случай.
Если фильтр на правую таблицу перенести в ON - это второй случай.

Разумеется, если множеств (таблиц) больше двух, то и вариантов
их пересечений и результатов становится больше.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557831
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В современных условиях наверное действительно лучше стремиться к канонической форме хотя бы для читабельности, но в 1-1.5 оптимизатор порой более уверенно обращался с индексами когда условие было в ON.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557832
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамРазумеется, если множеств (таблиц) больше двух, то и вариантов
их пересечений и результатов становится больше.
не-а. джойны все равно попарно выполняются (обрабатываются). в inner пары могут образовываться в зависимости от кардинальности (типа A + (B+C) или (A+B) +C и т.д.), а в left/right они образуются жестко в порядке следования.
Ну и еще, a right join b преобразуется оптимизатором в b left join a.

Так что, вариантов пересечения там больше не образуется, т.к. их последовательность по большей части фиксированная.
...
Рейтинг: 0 / 0
Пихать ли в join все, что можно?
    #39557847
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv> Так что, вариантов пересечения там больше не образуется,
kdv> т.к. их последовательность по большей части фиксированная.

Ну ты мне ещё про транзитивность расскажи. :)
Больше - потому что изменения результата
предыдущего соединения может повлиять на
следующее, хотя казалось бы его не трогает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 39, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Пихать ли в join все, что можно?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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