powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Что-то лыжи не едут (соединение двух партицированных таблиц)
23 сообщений из 23, страница 1 из 1
Что-то лыжи не едут (соединение двух партицированных таблиц)
    #39864343
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,

Есть две таблицы, одна основная (indicator), а другая содержит только комментарии (indicator_comment). Поскольку коментарии очень большие, они помещены в отдельную таблицу. Если делать простой джоин, то запрос ниже выдает 92 записи:
Код: sql
1.
2.
3.
4.
5.
6.
select *
from indicator i
join indicator_comment c
on i.pkey = 13717 and c.pkey = 13717 and 
i.pkey = c.pkey and
i.id = c.id  and i.student_id= 1168639



Здесь pkey - это ключ по которому партицированны обе таблицы.

Поскольку не все индикаторы имеют комментарий, то напрашивается "left join", но стоит изменить запрос на
Код: sql
1.
2.
3.
4.
5.
6.
select *
from indicator i
left join indicator_comment c
on i.pkey = 13717 and c.pkey = 13717 and 
i.pkey = c.pkey and
i.id = c.id  and i.student_id= 1168639


запрос начинает возвращать все 40 миллионов записей игнорируя фильтры в виде pkey и Id студента.

А должно быть всего 105 записей.

Что я делаю не так?

Спасибо.
...
Рейтинг: 0 / 0
Что-то лыжи не едут (соединение двух партицированных таблиц)
    #39864346
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roust_m,
может фильтр в where перенести?
...
Рейтинг: 0 / 0
Что-то лыжи не едут (соединение двух партицированных таблиц)
    #39864349
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy stRoust_m,
может фильтр в where перенести?

В этом случае запрос возвращает 92 записи, а не 105 как без джоина:
Код: sql
1.
2.
3.
4.
5.
select *
from indicator i
left join indicator_comment c
on i.id = c.id --and i.pkey = c.pkey 
where   i.pkey = 13717 and c.pkey = 13717 and  i.student_id= 1168639
...
Рейтинг: 0 / 0
Что-то лыжи не едут (соединение двух партицированных таблиц)
    #39864353
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roust_m,
Код: sql
1.
and c.pkey = 13717


может в секцию on ?
...
Рейтинг: 0 / 0
Что-то лыжи не едут (соединение двух партицированных таблиц)
    #39864354
Massa52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_m,
А если убрать c.pkey = 13717
...
Рейтинг: 0 / 0
Что-то лыжи не едут (соединение двух партицированных таблиц)
    #39864355
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Massa52Roust_m,
А если убрать c.pkey = 13717

Если это убрать или перенести в секцию "on", то все работает. Спасибо!
...
Рейтинг: 0 / 0
Что-то лыжи не едут (соединение двух партицированных таблиц)
    #39864419
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_mстоит изменить запрос на
Код: sql
1.
2.
3.
4.
5.
6.
select *
from indicator i
left join indicator_comment c
on i.pkey = 13717 and c.pkey = 13717 and 
i.pkey = c.pkey and
i.id = c.id  and i.student_id= 1168639



запрос начинает возвращать все 40 миллионов записей игнорируя фильтры в виде pkey и Id студента.Так нельзя писать запросы.
Если там простой джой, то сервер выправлят эту корявость, но с left начинаются чудеса ("чудеса" для разработчика, так то по логике всё правильно, и должно показываться "все 40 миллионов")

Нужно всегда в условии джойна (ON ...) писать только условие связывания таблиц, а в условии where условия фильтрации для основной части запроса (до JOIN)

Получается, по сути, изложение логики связывания в бизнес-терминах.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select *
from indicator i

    left join indicator_comment c
        on i.pkey = c.pkey and  -- условия связывания, 
        i.id = c.id             -- они обычно указаны в FK таблиц

where i.pkey = 13717            -- а тут указаны условия
    and i.student_id= 1168639   --  фильтрации данных
...
Рейтинг: 0 / 0
Что-то лыжи не едут (соединение двух партицированных таблиц)
    #39864436
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно всегда в условии джойна (ON ...) писать только условие связывания таблиц, а в условии where условия фильтрации для основной части запроса (до JOIN)Не всегда. Если связка нужна не для всех записей справочника, а только для некоторых, то фильтр по справочнику нужно делать именно в ON , т.к. фильтр в WHERE раст. нерабочий (пустой) запрос.
...
Рейтинг: 0 / 0
Что-то лыжи не едут (соединение двух партицированных таблиц)
    #39864438
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgНужно всегда в условии джойна (ON ...) писать только условие связывания таблиц, а в условии where условия фильтрации для основной части запроса (до JOIN)

нет.
условие на правую таблицу как раз и надо писать в on.
иначе left join выродится в inner join
...
Рейтинг: 0 / 0
Что-то лыжи не едут (соединение двух партицированных таблиц)
    #39864548
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123alexeyvgНужно всегда в условии джойна (ON ...) писать только условие связывания таблиц, а в условии where условия фильтрации для основной части запроса (до JOIN)

нет.
условие на правую таблицу как раз и надо писать в on.
иначе left join выродится в inner join

я, иногда, в таких случаях использую


Код: sql
1.
2.
3.
4.
5.
6.
7.
outer apply (
    select ..
    from ...
    where 
        %join predicates%
        and %filter predicates%
) 





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

а конcтрукция ?

... JOIN a
... JOIN b
ON a.. = b...
ON a.... = ..
...
Рейтинг: 0 / 0
Что-то лыжи не едут (соединение двух партицированных таблиц)
    #39864563
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKmsLex,

а конcтрукция ?

... JOIN a
... JOIN b
ON a.. = b...
ON a.... = ..

как то не прижилось, сложнее для понимания.

можете, ради интереса, среди своих (на работе) провести "соц опрос"- что будет при такой конструкции, и при outer apply

и я, почему-то, уверен, что с outer apply справится больше чем on ... on ...
...
Рейтинг: 0 / 0
Что-то лыжи не едут (соединение двух партицированных таблиц)
    #39864566
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLexTaPaKmsLex,

а конcтрукция ?

... JOIN a
... JOIN b
ON a.. = b...
ON a.... = ..

как то не прижилось, сложнее для понимания.

можете, ради интереса, среди своих (на работе) провести "соц опрос"- что будет при такой конструкции, и при outer apply

и я, почему-то, уверен, что с outer apply справится больше чем on ... on ...
ну обычно проще заходит просто
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
*
FROM x
.. JOIN   
(
	y
	..  JOIN z
	ON z.Id = y.ArticleId
)  
ON x... = y.Id
...
Рейтинг: 0 / 0
Что-то лыжи не едут (соединение двух партицированных таблиц)
    #39864576
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_m,


Попробуйте

Код: sql
1.
2.
3.
4.
select *
from (select * from indicator i where i.pkey = 13717 and i.student_id= 1168639) i 
left join (SELECT * FROM indicator_comment c WHERE c.pkey = 13717) c
on i.pkey = c.pkey and i.id = c.id 
...
Рейтинг: 0 / 0
Что-то лыжи не едут (соединение двух партицированных таблиц)
    #39864883
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123alexeyvgНужно всегда в условии джойна (ON ...) писать только условие связывания таблиц, а в условии where условия фильтрации для основной части запроса (до JOIN)

нет.
условие на правую таблицу как раз и надо писать в on.
иначе left join выродится в inner joinТак это условие джойна, по сути.
...
Рейтинг: 0 / 0
Что-то лыжи не едут (соединение двух партицированных таблиц)
    #39864970
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgYasha123пропущено...

нет.
условие на правую таблицу как раз и надо писать в on.
иначе left join выродится в inner joinТак это условие джойна, по сути.
т. е. если есть условие на левую таблицу, то это "фильтр", а на правую, так это сразу "условие соединения"?
комментарии со студентами связаны по ид.
больше никак.
это и есть "условие соединения".
теперь хочу записи только со студентами на букву "а", это уже фильтр.
а теперь из них хочу только тех, у кого в комментарии не написано "двоечник", и это уже вдруг не фильтр?
в ФК еще посоветуйте это засунуть...
...
Рейтинг: 0 / 0
Что-то лыжи не едут (соединение двух партицированных таблиц)
    #39865078
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123а теперь из них хочу только тех, у кого в комментарии не написано "двоечник", и это уже вдруг не фильтр?Конечно, не фильтр.

Если вы это засовываете в where, и фильтруете результат запроса, показывая только студентов, у которых в комментарии не написано "двоечник", то это фильтр.

А вот если это пишется в условии соединения, после ON, то вы не фильтруете студентов, вы фильтруете присоединяемые комментарии, то есть логично это называть условиями соединения.

Это всё, понятное дело, ненаучно, но это вполне нормальная терминология логики данных, логики запроса.
Впрочем, в документации это называется "join condition", так что, может, моя терминология не так уж "ненаучна".
...
Рейтинг: 0 / 0
Что-то лыжи не едут (соединение двух партицированных таблиц)
    #39865090
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgYasha123а теперь из них хочу только тех, у кого в комментарии не написано "двоечник", и это уже вдруг не фильтр?Конечно, не фильтр .
...
А вот если это пишется в условии соединения, после ON, то вы не фильтруете студентов, вы фильтруете присоединяемые комментарии , то есть логично это называть условиями соединения.
вы сами себы надули.
сначала спорите со мной и пишете, что это не фильтр,
и тут же строкой ниже признаете, что это именно фильтр на правую таблицу.
ну т. е. повторяете ровно мои слова
...
Рейтинг: 0 / 0
Что-то лыжи не едут (соединение двух партицированных таблиц)
    #39865101
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgЕсли вы это засовываете в where, и фильтруете результат запроса, показывая только студентов, у которых в комментарии не написано "двоечник", то это фильтр.
и вот это тоже неверно.
у меня на потоке всего 2 двоечника,
и будьте уверены, каждому двоечнику я влепляю соответствующий комментарий.
так вот, моя бизнес-логика просит: выдайте мне всех тех, кто не двоечник.
вы засовываете это в where, "показывая только студентов, у которых не написано",
и получаете просто неверный результат.
пустой результат.
хотя у меня из 100 студентов 98 должны были высветиться.
...
Рейтинг: 0 / 0
Что-то лыжи не едут (соединение двух партицированных таблиц)
    #39865105
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потому что именно у 98 как раз и "не написано".
у двоечников написано и они отсеялись.
а у 98 не написано вообще ничего.
просто потому, что остальным преподам было лень писать, таким образом комментариев всего 2,оба мои
...
Рейтинг: 0 / 0
Что-то лыжи не едут (соединение двух партицированных таблиц)
    #39865113
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123alexeyvgпропущено...
Конечно, не фильтр .
...
А вот если это пишется в условии соединения, после ON, то вы не фильтруете студентов, вы фильтруете присоединяемые комментарии , то есть логично это называть условиями соединения.
вы сами себы надули.
сначала спорите со мной и пишете, что это не фильтр,
и тут же строкой ниже признаете, что это именно фильтр на правую таблицу.
ну т. е. повторяете ровно мои словаВы же так не фильтруете студентов, вы фильтруете комментарии.
Я называю это условием соединения.

Вы же просто к словам придираетесь, да?

Я человеку объясняю так, что бы он не писал такой ужас, как в начале темы:
Код: sql
1.
2.
3.
4.
5.
6.
select *
from indicator i
join indicator_comment c
on i.pkey = 13717 and c.pkey = 13717 and 
i.pkey = c.pkey and
i.id = c.id  and i.student_id= 1168639

Для этого моё объяснение, что является фильтром, а что условием соединения, и как описание бизнес-логики от начальника положить на SQL, ИМХО достаточно понятное и удобное.

А вы начинаете про FK; вы ещё вспомните про нормальные формы, и про нотации IDEF1X и IE.
Зачем это всё?
...
Рейтинг: 0 / 0
Что-то лыжи не едут (соединение двух партицированных таблиц)
    #39865114
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123alexeyvgЕсли вы это засовываете в where, и фильтруете результат запроса, показывая только студентов, у которых в комментарии не написано "двоечник", то это фильтр.
и вот это тоже неверно.
...
и получаете просто неверный результат. И? Что вы хотели сказать?
Вы же поняли, что я имел в виду?
Я же не решал "задачу", и не делал проект для ВУЗа на заказ, какая разница в этом топике, покажутся двоечники, или не-двоечники.
...
Рейтинг: 0 / 0
Что-то лыжи не едут (соединение двух партицированных таблиц)
    #39865260
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgВы же так не фильтруете студентов, вы фильтруете комментарии.
Я называю это условием соединения.

Вы же просто к словам придираетесь, да?

к словам придираетесь вы.
именно что это "фильтр на комментарии", т. е. на правую таблицу.
и вы прицепились к этой моей формулировке и все никак не отцепитесь, причем через раз в своем упорстве вы сами ее же и используете.
не пойму, чего вы добиваетесь,
продолжайте в тои же духе, но без меня
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Что-то лыжи не едут (соединение двух партицированных таблиц)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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