Вы можете использовать LEFT JOIN
два раза, чтобы получить совпадающие и несоответствующие значения для каждого ID
и ParentID
. Кроме того, вам даже не нужно материализовать результаты, чтобы выполнить JOIN
до последней таблицы.
DECLARE @DataSource01 TABLE
(
[ID] SMALLINT
,[ParentID] INT
);
DECLARE @DataSource02 TABLE
(
[ID] SMALLINT
,[col1] CHAR(1)
,[col2] VARCHAR(3)
,[CID] TINYINT
);
DECLARE @DataSource03 TABLE
(
[TID] SMALLINT
,[col1] CHAR(1)
,[col2] CHAR(1)
,[col3] CHAR(1)
);
INSERT INTO @DataSource01 ([ID],[ParentID])
VALUES (234, 456)
,(123, 456)
,(344, 789);
INSERT INTO @DataSource02 ([ID], [col1], [col2], [CID])
VALUES (234, 'x', '879', 3)
,(456, 'x', 'x', 2)
,(987, 'x', 'x', 1)
,(344, 'x', 'x', 5)
,(999, 'x', 'x', 6);
INSERT INTO @DataSource03 ([TID], [col1], [col2], [col3])
VALUES (1, 'x', 'X', 'x')
,(2, 'x', 'x', 'x')
,(3, 'x', 'x', 'x')
,(4, 'x', 'x', 'x')
,(5, 'x', 'x', 'x');
SELECT DS1.[ID]
,DS1.[ParentID]
,CASE WHEN DS2_1.[ID] IS NULL THEN 'N' ELSE 'Y' END
,CASE WHEN DS2_2.[ID] IS NULL THEN 'N' ELSE 'Y' END
FROM @DataSource01 DS1
LEFT JOIN @DataSource02 DS2_1
ON DS1.[ID] = DS2_1.[ID]
LEFT JOIN @DataSource02 DS2_2
ON DS1.[ParentID] = DS2_2.[ID];
SELECT DS1.[ID]
,DS1.[ParentID]
,CASE WHEN DS2_1.[ID] IS NULL THEN 'N' ELSE 'Y' END
,CASE WHEN DS2_2.[ID] IS NULL THEN 'N' ELSE 'Y' END
,DS3.[TID]
FROM @DataSource01 DS1
LEFT JOIN @DataSource02 DS2_1
ON DS1.[ID] = DS2_1.[ID]
LEFT JOIN @DataSource02 DS2_2
ON DS1.[ParentID] = DS2_2.[ID]
LEFT JOIN @DataSource03 DS3
ON DS2_1.[CID] = DS3.[TID];

Это основы объединения данных. Теперь вы можете делать все, что вам нужно (PIVOT, материализовано, фильтровать).