Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Соединение таблиц по разным колонкам / 8 сообщений из 8, страница 1 из 1
02.03.2021, 09:34
    #40049739
skorpk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединение таблиц по разным колонкам
Добрый день. Есть задача. Нужно соединить две таблицы по разному количеству полей. Количество полей по которым нужно произвести соединение варьируется. Самый тупой способ решения задачи это методом перебора или динамический запрос. Но полей в двух таблиц много. Может есть альтернативное решение задачи или может кто то подтолкнет в какую сторону копать?
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
CREATE TABLE #tab(idRow tinyint,Val1 VARCHAR(5), Val2 TINYINT NOT null, Val3 VARCHAR(20), Val4 TINYINT)

CREATE TABLE #spr(id tinyint,Col1 VARCHAR(5), Col2 TINYINT NOT null, Col3 VARCHAR(20), Col4 TINYINT)

INSERT #tab(idRow,Val1,Val2,Val3,Val4) VALUES(1,'CCC',1,NULL,null)
INSERT #tab(idRow,Val1,Val2,Val3,Val4) VALUES(2,'AA',1,'bla',null)
INSERT #tab(idRow,Val1,Val2,Val3,Val4) VALUES(2,'AA',1,NULL,3)

INSERT #spr(id,Col1,Col2,Col3,Col4) VALUES(1,'CCC',1,NULL,null)
INSERT #spr(id,Col1,Col2,Col3,Col4) VALUES(2,'AA',1,NULL,3)


SELECT *
FROM #tab t INNER JOIN #spr s ON
		t.Val2=s.Col2
		AND t.val1=s.Col1
WHERE s.Col3 IS NULL AND s.col4 IS null

SELECT *
FROM #tab t INNER JOIN #spr s ON
		t.Val2=s.Col2
		AND t.val1=s.Col1
		AND t.Val3=s.Col3
WHERE s.Col4 IS null
SELECT *
FROM #tab t INNER JOIN #spr s ON
		t.Val2=s.Col2
		AND t.val1=s.Col1
		AND t.Val3=s.Col3
		AND t.Val4=s.Col4

SELECT *
FROM #tab t INNER JOIN #spr s ON
		t.Val2=s.Col2
		AND t.val1=s.Col1
		AND t.Val4=s.Col4
WHERE Col3 IS NULL
GO
DROP TABLE #spr
GO
DROP TABLE #tab
...
Рейтинг: 0 / 0
02.03.2021, 10:04
    #40049746
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединение таблиц по разным колонкам
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
declare @p1 bit = 1, @p2 bit = 1, @p3 bit = 0, @p4 bit = 0;

select
 *
from
 #tab t join
 #spr s on
  (@p1 = 0 or (@p1 = 1 and s.col1 = t.val1)) and
  (@p2 = 0 or (@p2 = 1 and s.col2 = t.val2)) and
  (@p3 = 0 or (@p3 = 1 and s.col3 = t.val3)) and
  (@p4 = 0 or (@p4 = 1 and s.col4 = t.val4));
...
Рейтинг: 0 / 0
02.03.2021, 10:26
    #40049755
skorpk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединение таблиц по разным колонкам
invm,Спасибо. Подобный вариант тоже крутился в голове, думал есть что то менее затратное. Но видимо его и буду использовать.
...
Рейтинг: 0 / 0
03.03.2021, 07:56
    #40050106
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединение таблиц по разным колонкам
skorpk
Добрый день. Есть задача. Нужно соединить две таблицы по разному количеству полей. Количество полей по которым нужно произвести соединение варьируется. Самый тупой способ решения задачи это методом перебора или динамический запрос. Но полей в двух таблиц много. Может есть альтернативное решение задачи или может кто то подтолкнет в какую сторону копать?

Как вариант, вставьте UNION между таблицами
Код: 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.
25.
26.
27.
28.
---UNION
SELECT *
FROM #tab t INNER JOIN #spr s ON
		t.Val2=s.Col2
		AND t.val1=s.Col1
WHERE s.Col3 IS NULL AND s.col4 IS null
Union
SELECT *
FROM #tab t INNER JOIN #spr s ON
		t.Val2=s.Col2
		AND t.val1=s.Col1
		AND t.Val3=s.Col3
WHERE s.Col4 IS null
Union
SELECT *
FROM #tab t INNER JOIN #spr s ON
		t.Val2=s.Col2
		AND t.val1=s.Col1
		AND t.Val3=s.Col3
		AND t.Val4=s.Col4
Union
SELECT *
FROM #tab t INNER JOIN #spr s ON
		t.Val2=s.Col2
		AND t.val1=s.Col1
		AND t.Val4=s.Col4
WHERE Col3 IS NULL
GO



или если хочется одним сканом, то
Код: sql
1.
2.
SELECT *
FROM #tab t INNER JOIN #spr s ON BINARY_CHECKSUM(t.Val1,t.Val2,t.Val3,t.Val4) = BINARY_CHECKSUM(s.Col1,s.Col2,s.Col3,s.Col4)
...
Рейтинг: 0 / 0
03.03.2021, 10:08
    #40050143
skorpk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединение таблиц по разным колонкам
HandKot, Спасибо, но я задачу не совсем корректно описал. BINARY_CHECKSUM не подходит т.к в #spr если в каком поле стоит null, а в #tab какое то значение тогда сравнение по данному полю не стоит производить. Поля по которым производится сравнение выбираются на основе заполненности полей в таблице #spr
...
Рейтинг: 0 / 0
03.03.2021, 10:43
    #40050161
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединение таблиц по разным колонкам
HandKot
Код: sql
1.
2.
SELECT *
FROM #tab t INNER JOIN #spr s ON BINARY_CHECKSUM(t.Val1,t.Val2,t.Val3,t.Val4) = BINARY_CHECKSUM(s.Col1,s.Col2,s.Col3,s.Col4)



BINARY_CHECKSUM не гарантирует уникальности результата. Не стоит ее использовать для join-а
...
Рейтинг: 0 / 0
03.03.2021, 11:47
    #40050207
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединение таблиц по разным колонкам
skorpk
в #spr если в каком поле стоит null, а в #tab какое то значение тогда сравнение по данному полю не стоит производить.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select
 *
from
 #tab t join
 #spr s on exists(
  select
   t.val1, t.val2, t.val3, t.val4,
   1

  intersect

  select
   isnull(s.col1, t.val1), isnull(s.col2, t.val2), isnull(s.col3, t.val3), isnull(s.col4, t.val4),
   case when coalesce(s.col1, s.col2, s.col3, s.col4) is null then 0 else 1 end
 )
...
Рейтинг: 0 / 0
03.03.2021, 13:35
    #40050284
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Соединение таблиц по разным колонкам
skorpk
HandKot, Спасибо, но я задачу не совсем корректно описал. BINARY_CHECKSUM не подходит т.к в #spr если в каком поле стоит null, а в #tab какое то значение тогда сравнение по данному полю не стоит производить. Поля по которым производится сравнение выбираются на основе заполненности полей в таблице #spr


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
Select
	*
From
	#tab t
Join #spr s On 
	Coalesce(s.Col1, t.Val1, '') = Coalesce(t.Val1, '')
	And Coalesce(s.Col2, t.Val2, 1) = Coalesce(t.Val2, 1)
	And Coalesce(s.Col3, t.Val3, '') = IsNull(t.Val3, '')
	And Coalesce(s.Col4, t.Val4, 1) = IsNull(t.Val4, 1)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Соединение таблиц по разным колонкам / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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