powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Соединение таблиц по разным колонкам
8 сообщений из 8, страница 1 из 1
Соединение таблиц по разным колонкам
    #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
Соединение таблиц по разным колонкам
    #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
Соединение таблиц по разным колонкам
    #40049755
skorpk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,Спасибо. Подобный вариант тоже крутился в голове, думал есть что то менее затратное. Но видимо его и буду использовать.
...
Рейтинг: 0 / 0
Соединение таблиц по разным колонкам
    #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
Соединение таблиц по разным колонкам
    #40050143
skorpk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HandKot, Спасибо, но я задачу не совсем корректно описал. BINARY_CHECKSUM не подходит т.к в #spr если в каком поле стоит null, а в #tab какое то значение тогда сравнение по данному полю не стоит производить. Поля по которым производится сравнение выбираются на основе заполненности полей в таблице #spr
...
Рейтинг: 0 / 0
Соединение таблиц по разным колонкам
    #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
Соединение таблиц по разным колонкам
    #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
Соединение таблиц по разным колонкам
    #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
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Соединение таблиц по разным колонкам
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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