Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Что-то лыжи не едут (соединение двух партицированных таблиц)  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1121
Добрый день,

Есть две таблицы, одна основная (indicator), а другая содержит только комментарии (indicator_comment). Поскольку коментарии очень большие, они помещены в отдельную таблицу. Если делать простой джоин, то запрос ниже выдает 92 записи:
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", но стоит изменить запрос на
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 записей.

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

Спасибо.
20 сен 19, 07:21    [21974875]     Ответить | Цитировать Сообщить модератору
 Re: Что-то лыжи не едут (соединение двух партицированных таблиц)  [new]
andy st
Member

Откуда:
Сообщений: 797
Roust_m,
может фильтр в where перенести?
20 сен 19, 07:33    [21974879]     Ответить | Цитировать Сообщить модератору
 Re: Что-то лыжи не едут (соединение двух партицированных таблиц)  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1121
andy st
Roust_m,
может фильтр в where перенести?


В этом случае запрос возвращает 92 записи, а не 105 как без джоина:
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
20 сен 19, 07:43    [21974883]     Ответить | Цитировать Сообщить модератору
 Re: Что-то лыжи не едут (соединение двух партицированных таблиц)  [new]
andy st
Member

Откуда:
Сообщений: 797
Roust_m,
and c.pkey = 13717

может в секцию on ?
20 сен 19, 07:53    [21974887]     Ответить | Цитировать Сообщить модератору
 Re: Что-то лыжи не едут (соединение двух партицированных таблиц)  [new]
Massa52
Member

Откуда:
Сообщений: 379
Roust_m,
А если убрать c.pkey = 13717
20 сен 19, 07:53    [21974888]     Ответить | Цитировать Сообщить модератору
 Re: Что-то лыжи не едут (соединение двух партицированных таблиц)  [new]
Roust_m
Member

Откуда: Сидней
Сообщений: 1121
Massa52
Roust_m,
А если убрать c.pkey = 13717


Если это убрать или перенести в секцию "on", то все работает. Спасибо!
20 сен 19, 07:59    [21974889]     Ответить | Цитировать Сообщить модератору
 Re: Что-то лыжи не едут (соединение двух партицированных таблиц)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31364
Roust_m
стоит изменить запрос на
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)

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

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   --  фильтрации данных
20 сен 19, 10:10    [21974990]     Ответить | Цитировать Сообщить модератору
 Re: Что-то лыжи не едут (соединение двух партицированных таблиц)  [new]
L_argo
Member

Откуда:
Сообщений: 1217
Нужно всегда в условии джойна (ON ...) писать только условие связывания таблиц, а в условии where условия фильтрации для основной части запроса (до JOIN)
Не всегда. Если связка нужна не для всех записей справочника, а только для некоторых, то фильтр по справочнику нужно делать именно в ON , т.к. фильтр в WHERE раст. нерабочий (пустой) запрос.
20 сен 19, 10:42    [21975017]     Ответить | Цитировать Сообщить модератору
 Re: Что-то лыжи не едут (соединение двух партицированных таблиц)  [new]
Yasha123
Member

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

нет.
условие на правую таблицу как раз и надо писать в on.
иначе left join выродится в inner join
20 сен 19, 10:47    [21975022]     Ответить | Цитировать Сообщить модератору
 Re: Что-то лыжи не едут (соединение двух партицированных таблиц)  [new]
msLex
Member

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

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


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


outer apply (
    select ..
    from ...
    where 
        %join predicates%
        and %filter predicates%
) 




особенно, если "слева" нужно подцепит 2 таблицы, связанные между собой через inner join
20 сен 19, 12:41    [21975186]     Ответить | Цитировать Сообщить модератору
 Re: Что-то лыжи не едут (соединение двух партицированных таблиц)  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
msLex,

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

... JOIN a
... JOIN b
ON a.. = b...
ON a.... = ..
20 сен 19, 12:44    [21975190]     Ответить | Цитировать Сообщить модератору
 Re: Что-то лыжи не едут (соединение двух партицированных таблиц)  [new]
msLex
Member

Откуда:
Сообщений: 8091
TaPaK
msLex,

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

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


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

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

и я, почему-то, уверен, что с outer apply справится больше чем on ... on ...
20 сен 19, 12:54    [21975204]     Ответить | Цитировать Сообщить модератору
 Re: Что-то лыжи не едут (соединение двух партицированных таблиц)  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
msLex
TaPaK
msLex,

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

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


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

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

и я, почему-то, уверен, что с outer apply справится больше чем on ... on ...

ну обычно проще заходит просто
*
FROM x
.. JOIN   
(
	y
	..  JOIN z
	ON z.Id = y.ArticleId
)  
ON x... = y.Id
20 сен 19, 12:59    [21975208]     Ответить | Цитировать Сообщить модератору
 Re: Что-то лыжи не едут (соединение двух партицированных таблиц)  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4739
Roust_m,


Попробуйте

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 
20 сен 19, 13:10    [21975227]     Ответить | Цитировать Сообщить модератору
 Re: Что-то лыжи не едут (соединение двух партицированных таблиц)  [new]
alexeyvg
Member

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

нет.
условие на правую таблицу как раз и надо писать в on.
иначе left join выродится в inner join
Так это условие джойна, по сути.
20 сен 19, 22:27    [21975788]     Ответить | Цитировать Сообщить модератору
 Re: Что-то лыжи не едут (соединение двух партицированных таблиц)  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
alexeyvg
Yasha123
пропущено...

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

т. е. если есть условие на левую таблицу, то это "фильтр", а на правую, так это сразу "условие соединения"?
комментарии со студентами связаны по ид.
больше никак.
это и есть "условие соединения".
теперь хочу записи только со студентами на букву "а", это уже фильтр.
а теперь из них хочу только тех, у кого в комментарии не написано "двоечник", и это уже вдруг не фильтр?
в ФК еще посоветуйте это засунуть...
21 сен 19, 12:45    [21975911]     Ответить | Цитировать Сообщить модератору
 Re: Что-то лыжи не едут (соединение двух партицированных таблиц)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31364
Yasha123
а теперь из них хочу только тех, у кого в комментарии не написано "двоечник", и это уже вдруг не фильтр?
Конечно, не фильтр.

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

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

Это всё, понятное дело, ненаучно, но это вполне нормальная терминология логики данных, логики запроса.
Впрочем, в документации это называется "join condition", так что, может, моя терминология не так уж "ненаучна".
21 сен 19, 19:13    [21976043]     Ответить | Цитировать Сообщить модератору
 Re: Что-то лыжи не едут (соединение двух партицированных таблиц)  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
alexeyvg
Yasha123
а теперь из них хочу только тех, у кого в комментарии не написано "двоечник", и это уже вдруг не фильтр?
Конечно, не фильтр.
...
А вот если это пишется в условии соединения, после ON, то вы не фильтруете студентов, вы фильтруете присоединяемые комментарии, то есть логично это называть условиями соединения.

вы сами себы надули.
сначала спорите со мной и пишете, что это не фильтр,
и тут же строкой ниже признаете, что это именно фильтр на правую таблицу.
ну т. е. повторяете ровно мои слова
21 сен 19, 21:08    [21976063]     Ответить | Цитировать Сообщить модератору
 Re: Что-то лыжи не едут (соединение двух партицированных таблиц)  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
alexeyvg
Если вы это засовываете в where, и фильтруете результат запроса, показывая только студентов, у которых в комментарии не написано "двоечник", то это фильтр.

и вот это тоже неверно.
у меня на потоке всего 2 двоечника,
и будьте уверены, каждому двоечнику я влепляю соответствующий комментарий.
так вот, моя бизнес-логика просит: выдайте мне всех тех, кто не двоечник.
вы засовываете это в where, "показывая только студентов, у которых не написано",
и получаете просто неверный результат.
пустой результат.
хотя у меня из 100 студентов 98 должны были высветиться.
21 сен 19, 21:38    [21976074]     Ответить | Цитировать Сообщить модератору
 Re: Что-то лыжи не едут (соединение двух партицированных таблиц)  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
потому что именно у 98 как раз и "не написано".
у двоечников написано и они отсеялись.
а у 98 не написано вообще ничего.
просто потому, что остальным преподам было лень писать, таким образом комментариев всего 2,оба мои
21 сен 19, 21:49    [21976079]     Ответить | Цитировать Сообщить модератору
 Re: Что-то лыжи не едут (соединение двух партицированных таблиц)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31364
Yasha123
alexeyvg
пропущено...
Конечно, не фильтр.
...
А вот если это пишется в условии соединения, после ON, то вы не фильтруете студентов, вы фильтруете присоединяемые комментарии, то есть логично это называть условиями соединения.

вы сами себы надули.
сначала спорите со мной и пишете, что это не фильтр,
и тут же строкой ниже признаете, что это именно фильтр на правую таблицу.
ну т. е. повторяете ровно мои слова
Вы же так не фильтруете студентов, вы фильтруете комментарии.
Я называю это условием соединения.

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

Я человеку объясняю так, что бы он не писал такой ужас, как в начале темы:
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.
Зачем это всё?
21 сен 19, 22:18    [21976087]     Ответить | Цитировать Сообщить модератору
 Re: Что-то лыжи не едут (соединение двух партицированных таблиц)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31364
Yasha123
alexeyvg
Если вы это засовываете в where, и фильтруете результат запроса, показывая только студентов, у которых в комментарии не написано "двоечник", то это фильтр.

и вот это тоже неверно.
...
и получаете просто неверный результат.
И? Что вы хотели сказать?
Вы же поняли, что я имел в виду?
Я же не решал "задачу", и не делал проект для ВУЗа на заказ, какая разница в этом топике, покажутся двоечники, или не-двоечники.
21 сен 19, 22:23    [21976088]     Ответить | Цитировать Сообщить модератору
 Re: Что-то лыжи не едут (соединение двух партицированных таблиц)  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
alexeyvg
Вы же так не фильтруете студентов, вы фильтруете комментарии.
Я называю это условием соединения.

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

к словам придираетесь вы.
именно что это "фильтр на комментарии", т. е. на правую таблицу.
и вы прицепились к этой моей формулировке и все никак не отцепитесь, причем через раз в своем упорстве вы сами ее же и используете.
не пойму, чего вы добиваетесь,
продолжайте в тои же духе, но без меня
22 сен 19, 18:19    [21976290]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить