Я не фанат этого решения, так как JOIN
с EXISTS
ужасен. Я настоятельно рекомендую исправить вашу модель данных здесь. Вы не должны использовать данные с разделителями в своей таблице, и вы не должны использовать значение типа 'rest'
, чтобы обозначить, что вы хотите, чтобы все другие значения отличались от ранее определенных. Полученный здесь результирующий набор является нормализованным набором данных, и именно таким образом вы должны хранить свои данные:
CREATE TABLE Table1 (Number varchar(6), --A number is a varchar?
Code varchar(50),
[Value] int);
INSERT INTO dbo.Table1 (Number,
Code,
[Value])
VALUES ('Garden','A0,C2',100),
('Garden','rest',500),
('House','A0,C2',100),
('House','rest',500);
CREATE TABLE Table2 (Code char(2));
INSERT INTO dbo.Table2 (Code)
VALUES ('A0'),
('B1'),
('C2'),
('D3'),
('E4');
GO
WITH CTE AS(
SELECT T1.Number,
SS.[value] AS Code,
T1.[Value]
FROM dbo.Table1 T1
CROSS APPLY STRING_SPLIT(T1.Code, ',') SS)
SELECT C.Number,
T2.Code,
C.[Value]
FROM CTE C
JOIN dbo.Table2 T2 ON C.Code = T2.Code
OR (C.Code = 'rest'
AND NOT EXISTS (SELECT 1
FROM CTE e
WHERE e.Number = C.Number
AND e.Code = T2.Code))
GO
DROP TABLE dbo.Table1;
DROP TABLE dbo.Table2;
дб <> скрипка
Если вы не используете SQL Server 2016+, вы не сможете использовать STRING_SPLIT
. В результате я предлагаю поискать «XML Splitter» или delimitedsplit8k(_lead)
.