Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Что-то лыжи не едут (соединение двух партицированных таблиц) / 23 сообщений из 23, страница 1 из 1
20.09.2019, 07:21
    #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
20.09.2019, 07:33
    #39864346
andy st
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то лыжи не едут (соединение двух партицированных таблиц)
Roust_m,
может фильтр в where перенести?
...
Рейтинг: 0 / 0
20.09.2019, 07:43
    #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
20.09.2019, 07:53
    #39864353
andy st
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то лыжи не едут (соединение двух партицированных таблиц)
Roust_m,
Код: sql
1.
and c.pkey = 13717


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

Если это убрать или перенести в секцию "on", то все работает. Спасибо!
...
Рейтинг: 0 / 0
20.09.2019, 10:10
    #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
20.09.2019, 10:42
    #39864436
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то лыжи не едут (соединение двух партицированных таблиц)
Нужно всегда в условии джойна (ON ...) писать только условие связывания таблиц, а в условии where условия фильтрации для основной части запроса (до JOIN)Не всегда. Если связка нужна не для всех записей справочника, а только для некоторых, то фильтр по справочнику нужно делать именно в ON , т.к. фильтр в WHERE раст. нерабочий (пустой) запрос.
...
Рейтинг: 0 / 0
20.09.2019, 10:47
    #39864438
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то лыжи не едут (соединение двух партицированных таблиц)
alexeyvgНужно всегда в условии джойна (ON ...) писать только условие связывания таблиц, а в условии where условия фильтрации для основной части запроса (до JOIN)

нет.
условие на правую таблицу как раз и надо писать в on.
иначе left join выродится в inner join
...
Рейтинг: 0 / 0
20.09.2019, 12:41
    #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
20.09.2019, 12:44
    #39864552
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то лыжи не едут (соединение двух партицированных таблиц)
msLex,

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

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

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

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

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

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

и я, почему-то, уверен, что с outer apply справится больше чем on ... on ...
...
Рейтинг: 0 / 0
20.09.2019, 12:59
    #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
20.09.2019, 13:10
    #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
20.09.2019, 22:27
    #39864883
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то лыжи не едут (соединение двух партицированных таблиц)
Yasha123alexeyvgНужно всегда в условии джойна (ON ...) писать только условие связывания таблиц, а в условии where условия фильтрации для основной части запроса (до JOIN)

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

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

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

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

Это всё, понятное дело, ненаучно, но это вполне нормальная терминология логики данных, логики запроса.
Впрочем, в документации это называется "join condition", так что, может, моя терминология не так уж "ненаучна".
...
Рейтинг: 0 / 0
21.09.2019, 21:08
    #39865090
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то лыжи не едут (соединение двух партицированных таблиц)
alexeyvgYasha123а теперь из них хочу только тех, у кого в комментарии не написано "двоечник", и это уже вдруг не фильтр?Конечно, не фильтр .
...
А вот если это пишется в условии соединения, после ON, то вы не фильтруете студентов, вы фильтруете присоединяемые комментарии , то есть логично это называть условиями соединения.
вы сами себы надули.
сначала спорите со мной и пишете, что это не фильтр,
и тут же строкой ниже признаете, что это именно фильтр на правую таблицу.
ну т. е. повторяете ровно мои слова
...
Рейтинг: 0 / 0
21.09.2019, 21:38
    #39865101
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то лыжи не едут (соединение двух партицированных таблиц)
alexeyvgЕсли вы это засовываете в where, и фильтруете результат запроса, показывая только студентов, у которых в комментарии не написано "двоечник", то это фильтр.
и вот это тоже неверно.
у меня на потоке всего 2 двоечника,
и будьте уверены, каждому двоечнику я влепляю соответствующий комментарий.
так вот, моя бизнес-логика просит: выдайте мне всех тех, кто не двоечник.
вы засовываете это в where, "показывая только студентов, у которых не написано",
и получаете просто неверный результат.
пустой результат.
хотя у меня из 100 студентов 98 должны были высветиться.
...
Рейтинг: 0 / 0
21.09.2019, 21:49
    #39865105
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то лыжи не едут (соединение двух партицированных таблиц)
потому что именно у 98 как раз и "не написано".
у двоечников написано и они отсеялись.
а у 98 не написано вообще ничего.
просто потому, что остальным преподам было лень писать, таким образом комментариев всего 2,оба мои
...
Рейтинг: 0 / 0
21.09.2019, 22:18
    #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
21.09.2019, 22:23
    #39865114
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то лыжи не едут (соединение двух партицированных таблиц)
Yasha123alexeyvgЕсли вы это засовываете в where, и фильтруете результат запроса, показывая только студентов, у которых в комментарии не написано "двоечник", то это фильтр.
и вот это тоже неверно.
...
и получаете просто неверный результат. И? Что вы хотели сказать?
Вы же поняли, что я имел в виду?
Я же не решал "задачу", и не делал проект для ВУЗа на заказ, какая разница в этом топике, покажутся двоечники, или не-двоечники.
...
Рейтинг: 0 / 0
22.09.2019, 18:19
    #39865260
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то лыжи не едут (соединение двух партицированных таблиц)
alexeyvgВы же так не фильтруете студентов, вы фильтруете комментарии.
Я называю это условием соединения.

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

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


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