Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / JOIN трех таблиц / 11 сообщений из 11, страница 1 из 1
19.03.2018, 12:12
    #39616716
Arl
Arl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN трех таблиц
Добрый день всем!

Такая ситуация. Есть три таблицы. t1, t2, t3

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
t1:
id	val
1	один

t2:
id	val
1	Два
1	Два - вторая

t3:
id	val
1	три
1	Три - вторая



Пишем JOIN
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
SELECT
	*
FROM
	-------------------------------
	(SELECT
		*
	FROM
		DB.dbo.t1) tab1

	-------------------------------	
	LEFT JOIN
	(SELECT
		*
	FROM
		DB.dbo.t2) tab2
	ON tab1.id = tab2.id

	-------------------------------	
	LEFT JOIN
	(SELECT
		*
	FROM
		DB.dbo.t3) tab3
	ON tab1.id = tab3.id



В результате получаем JOIN первых двух таблиц, и к этому результату JOIN третьей.
Код: sql
1.
2.
3.
4.
5.
id	val		id1		val1			id2	val2
1	один		1		Два			1	три
1	один		1		Два			1	Три - вторая
1	один		1		Два - вторая		1	три
1	один		1		Два - вторая		1	Три - вторая



А как получить такой результат:?
Код: sql
1.
2.
3.
id	val		id1		val1			id2	val2
1	один		1		Два			1	три
1	один		1		Два - вторая		1	Три - вторая
...
Рейтинг: 0 / 0
19.03.2018, 12:26
    #39616728
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN трех таблиц
Arl,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
With 
tab1 as 
(SELECT *,row_number() over (Partition by id order by (Select 1) /*или по желанию Order by val*/) as rn
	FROM DB.dbo.t1),
tab2 as  
(SELECT *,row_number() over (Partition by id order by (Select 1) /*или по желанию Order by val*/) as rn
	FROM DB.dbo.t2),
tab3 as  
(SELECT *,row_number() over (Partition by id order by (Select 1) /*или по желанию Order by val*/) as rn
	FROM DB.dbo.t3)
SELECT
	COALESCE(tab1.id,tab2.id,tab3.id),
	tab1.val,
	tab2.val,
	tab3.val
FROM
	 tab1
	full join tab2 ON tab1.id = tab2.id and tab1.rn = tab2.rn
	full join tab3 ON isnull(tab1.id,tab2.id) = tab3.id and isnull(tab1.rn,tab2.rn) = tab3.rn
...
Рейтинг: 0 / 0
19.03.2018, 12:30
    #39616732
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN трех таблиц
Arl,
Точнее под ваши выходные данные:

With
tab1 as
(SELECT * DB.dbo.t1),
tab2 as
(SELECT *,row_number() over (Partition by id order by (Select 1) /*или по желанию Order by val*/) as rn
FROM DB.dbo.t2),
tab3 as
(SELECT *,row_number() over (Partition by id order by (Select 1) /*или по желанию Order by val*/) as rn
FROM DB.dbo.t3)
SELECT
tab1.id,
tab1.val,
tab2.id,
tab2.val,
tab3.id,
tab3.val
FROM
tab1
left join tab2 ON tab1.id = tab2.id
left join tab3 ON tab1.id = tab3.id and tab2.rn = tab3.rn
...
Рейтинг: 0 / 0
19.03.2018, 12:48
    #39616743
Arl
Arl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN трех таблиц
Спасибо, буду разбираться.
...
Рейтинг: 0 / 0
19.03.2018, 14:26
    #39616820
Гигабайт Мегабайтович Килобайтов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN трех таблиц
а чего тут разбираться то ))
если вы сможете объяснить почему записи не должны "размножаться" по правилам множества - то сами и ответите как вам сделать правильный джоин.
...
Рейтинг: 0 / 0
19.03.2018, 14:43
    #39616838
Arl
Arl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN трех таблиц
Гигабайт Мегабайтович Килобайтов,
Я ошибочно полагал, что sql server делает второй JOIN к первой таблице, а не к результату JOINа первой и второй таблиц.
...
Рейтинг: 0 / 0
19.03.2018, 18:17
    #39617005
Гигабайт Мегабайтович Килобайтов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN трех таблиц
ArlГигабайт Мегабайтович Килобайтов,
Я ошибочно полагал, что sql server делает второй JOIN к первой таблице, а не к результату JOINа первой и второй таблиц.
так он и делает к первой таблице )) - только там данных оказывается больше ))
...
Рейтинг: 0 / 0
20.03.2018, 06:05
    #39617150
Arl
Arl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN трех таблиц
Гигабайт Мегабайтович Килобайтов,

В таблице t1 запись одна.
После первого JOIN в объединенной таблице становится две записи.
Второй JOIN (таблица t3) идет уже к объединенной таблице с двумя записями (t1 + t2),
и в результате записей становится четыре.

А я думал, что второй JOIN будет к таблице t1 с одной записью.
...
Рейтинг: 0 / 0
20.03.2018, 09:50
    #39617250
Гигабайт Мегабайтович Килобайтов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN трех таблиц
ArlГигабайт Мегабайтович Килобайтов,

В таблице t1 запись одна.
После первого JOIN в объединенной таблице становится две записи.
Второй JOIN (таблица t3) идет уже к объединенной таблице с двумя записями (t1 + t2),
и в результате записей становится четыре.

А я думал, что второй JOIN будет к таблице t1 с одной записью.
Это вы хотите так "видеть" )) а на самом деле таки объединяет t1 и t3.
потому что если следовать вашей логике , то поменяв порядок джоинов - вы "должны" получить что хотите ))) но это ведь не так? ))
...
Рейтинг: 0 / 0
20.03.2018, 11:00
    #39617314
Arl
Arl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN трех таблиц
Гигабайт Мегабайтович Килобайтов,
Гигабайт Мегабайтович КилобайтовЭто вы хотите так "видеть" )) а на самом деле таки объединяет t1 и t3.

Но ведь в t1 изначально только одна запись...

Я так понимаю, что происходит объединение сначала таблиц t1 и t2, в результате появляются две записи c id = 1,
и уже с этим результатом происходит следующее объединение, и получается 4 записи.
Поправьте, если не прав.
...
Рейтинг: 0 / 0
20.03.2018, 11:04
    #39617320
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN трех таблиц
ArlГигабайт Мегабайтович Килобайтов,
Гигабайт Мегабайтович КилобайтовЭто вы хотите так "видеть" )) а на самом деле таки объединяет t1 и t3.

Но ведь в t1 изначально только одна запись...

Я так понимаю, что происходит объединение сначала таблиц t1 и t2, в результате появляются две записи c id = 1,
и уже с этим результатом происходит следующее объединение, и получается 4 записи.
Поправьте, если не прав.
да откройте уже план и посмотрите
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / JOIN трех таблиц / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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