powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Left Join по нескольким полям
10 сообщений из 10, страница 1 из 1
Left Join по нескольким полям
    #40062573
HarDar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер

Есть пара таблиц
В каждой есть несколько полей комбинация которых в одной из таблиц уникальна, а в другой будет несколько строк
и при этом количество этих "несколько строк" может отличаться.
основной смысл запроса получить полный перечень первой таблицы и значения из второй по определенному критерию, с null там где такого критерия нет.

как используя джойны соединить таблицы чтобы получить в результирующем запросе "пропущенные" строки второй таблицы

вот для объяснения

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create table #T1 (num int, ver int, pos int, name nvarchar(20))
insert into #T1 values (1,1,1,N'x'),(1,1,2,N'gx'),(1,1,3,N'egx'),(2,1,1,N'gex'),(2,1,2,N'xe'),(3,3,3,N'22xe')

create table #T2 (num int, ver int, pos int, par int, val int)
insert into #T2 values (1,1,1,1,1),(1,1,1,2,2),(1,1,1,3,3),(1,1,1,5,5),(1,1,1,6,6),(1,1,1,7,7)
insert into #T2 values (1,1,2,1,1),            (1,1,2,3,3),(1,1,2,5,5),            (1,1,2,7,7)
insert into #T2 values (1,1,3,1,1),(1,1,3,2,2),            (1,1,3,5,5),(1,1,3,6,6),(1,1,3,7,7)
insert into #T2 values (2,1,1,1,1),(2,1,1,2,2),(2,1,1,3,3),            (2,1,1,6,6),(2,1,1,7,7)
insert into #T2 values (2,1,2,1,1),(2,1,2,2,2),            (2,1,2,5,5),(2,1,2,6,6),(2,1,2,7,7)

select * from #T1 inner join #T2 on #T1.num = #T2.num AND #T1.ver = #T2.ver AND #T1.pos = #T2.pos
select * from #T1 left join #T2 on #T1.num = #T2.num AND #T1.ver = #T2.ver AND #T1.pos = #T2.pos
select * from #T1 inner join #T2 on #T1.num = #T2.num AND #T1.ver = #T2.ver AND #T1.pos = #T2.pos where #T2.par = 3
select * from #T1 left join #T2 on #T1.num = #T2.num AND #T1.ver = #T2.ver AND #T1.pos = #T2.pos  where #T2.par = 3

drop table #T1
drop table #T2



запрос 1 - обычный join выдает строки которые которые есть в двух таблицах, тут все разумно и освоено
запрос 2 - а вот left выдает null только если никакого из трех полей нет в Т2
запрос 3 - ну тут все понятно где есть значение выводим (3 строки)
запрос 4 - а вот тут получается что результат как в 3м, но хотелось то получить 6 строк и 3 из них с null

как получить вот такое
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
		#T1					#T2
num	ver	pos	name	num	ver	pos	par	val
1	1	1	x	1	1	1	3	3
1	1	2	egx	NULL	NULL	NULL	NULL	NULL
1	1	3	gx	1	1	2	3	3
2	1	1	gex	2	1	1	3	3
2	1	2	xe	NULL	NULL	NULL	NULL	NULL
3	3	3	22xe	NULL	NULL	NULL	NULL	NULL
...
Рейтинг: 0 / 0
Left Join по нескольким полям
    #40062581
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. посмотри в сторону outer apply

select #T1.*, B.* from #T1 outer apply (select top 1 * from #T2 where #T1.num = #T2.num AND #T1.ver = #T2.ver AND #T1.pos = #T2.pos) B

2. Непонятно как в результате-примере получется

1 1 2 egx NULL NULL NULL NULL NULL
2 1 2 xe NULL NULL NULL NULL NULL
...
Рейтинг: 0 / 0
Left Join по нескольким полям
    #40062585
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
select * from #T1 left join #T2 on #T1.num = #T2.num AND #T1.ver = #T2.ver AND #T1.pos = #T2.pos and #T2.par = 3
...
Рейтинг: 0 / 0
Left Join по нескольким полям
    #40062719
HarDar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,

ОГРОМНОЕ СПАСИБО

идеальный результат,
как то никогда в голову не приходило, что в объединении можно подставить одно из полей как значение.
...
Рейтинг: 0 / 0
Left Join по нескольким полям
    #40064508
Запрос вида
Код: sql
1.
2.
3.
SELECT <Field_List>
FROM T1 LEFT JOIN T2 ON <Join_Conditions>
WHERE <T2_Filter>


эквивалентен запросу
Код: sql
1.
2.
3.
SELECT <Field_List>
FROM T1 INNER JOIN T2 ON <Join_Conditions>
WHERE <T2_Filter>


Правильно так:
Код: sql
1.
2.
SELECT <Field_List>
FROM T1 LEFT JOIN T2 ON <Join_Conditions> AND <T2_Filter>
...
Рейтинг: 0 / 0
Left Join по нескольким полям
    #40064539
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Джонни Кейдж
Запрос вида
Код: sql
1.
2.
3.
SELECT <Field_List>
FROM T1 LEFT JOIN T2 ON <Join_Conditions>
WHERE <T2_Filter>



эквивалентен запросу
Код: sql
1.
2.
3.
SELECT <Field_List>
FROM T1 INNER JOIN T2 ON <Join_Conditions>
WHERE <T2_Filter>



Правильно так:
Код: sql
1.
2.
SELECT <Field_List>
FROM T1 LEFT JOIN T2 ON <Join_Conditions> AND <T2_Filter>

Не совсем так. Если в <T2_Filter> учитываются возможные значения NULL в полях T2,
то первый запрос тоже допустим.
...
Рейтинг: 0 / 0
Left Join по нескольким полям
    #40064719
Uridian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iap
Не совсем так.

Есть нюансы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
use tempdb
drop table if exists t2;
drop table if exists t1;
create table t1 (pk int primary key);
insert t1 values (1), (2), (3);
create table t2 (fk int references t1(pk), nullable int);
insert t2 values (1, 1), (2, 2), (2, null);
-- where <null-filter>
select *
from t1
left join t2 on t2.fk = t1.pk
where t2.nullable is not null
-- on <null-filter>
select *
from t1
left join t2 on t2.fk = t1.pk and t2.nullable is not null
--
drop table if exists t2;
drop table if exists t1;

...
Рейтинг: 0 / 0
Left Join по нескольким полям
    #40064730
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Uridian,

где в примере "учитываются возможные значения NULL"? В примере они отрицаются.
...
Рейтинг: 0 / 0
Left Join по нескольким полям
    #40064736
Uridian
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов
Uridian,
где в примере


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
use tempdb
drop table if exists t2;
drop table if exists t1;
create table t1 (pk int primary key);
insert t1 values (1), (2), (3);
create table t2 (fk int references t1(pk), nullable int);
insert t2 values (1, 1), (2, 2), (2, null);
-- where <null-filter>
select *
from t1
left join t2 on t2.fk = t1.pk
where t2.nullable is null
-- on <null-filter>
select *
from t1
left join t2 on t2.fk = t1.pk and t2.nullable is null
drop table if exists t2;
drop table if exists t1;

...
Рейтинг: 0 / 0
Left Join по нескольким полям
    #40064773
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Uridian
Владислав Колосов
Uridian,
где в примере


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
use tempdb
drop table if exists t2;
drop table if exists t1;
create table t1 (pk int primary key);
insert t1 values (1), (2), (3);
create table t2 (fk int references t1(pk), nullable int);
insert t2 values (1, 1), (2, 2), (2, null);
-- where <null-filter>
select *
from t1
left join t2 on t2.fk = t1.pk
where t2.nullable is null
-- on <null-filter>
select *
from t1
left join t2 on t2.fk = t1.pk and t2.nullable is null
drop table if exists t2;
drop table if exists t1;


А так?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
use tempdb
drop table if exists t2;
drop table if exists t1;
create table t1 (pk int primary key);
insert t1 values (1), (2), (3);
create table t2 (fk int references t1(pk), nullable int);
insert t2 values (1, 1), (2, 2), (2, null);
-- where <null-filter>
select *
from t1
left join t2 on t2.fk = t1.pk and t2.nullable is null
where t2.nullable is null and (t2.fk = t1.pk or t2.fk is null)
-- on <null-filter>
select *
from t1
left join t2 on t2.fk = t1.pk and t2.nullable is null
drop table if exists t2;
drop table if exists t1;



В WHERE ограничения на правую таблицу LEFT JOIN, а результат тем не менее тот же.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Left Join по нескольким полям
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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