Комплексное объединение для возврата SuperSet
Вечер всех,
Некоторое время я обменивался этим, и по какой-то причине я просто не могу заставить свою логику вернуть то, что я ожидаю.
У меня есть 3 таблицы данных, а также 3 таблицы связывания бизнес-концепции.
- Таблица 1
- Таблица 2
- Таблица3
Правила:
- Таблица 1 может быть связана с таблицей 2
- Таблица 1 может быть напрямую связана с таблицей 3
- Таблица 1 может быть косвенно связана с таблицей 3 через таблицу 2
Я попробовал несколько вариантов, однако, похоже, обрезать записи.
SELECT
*
FROM
Table1 T1
INNER JOIN Table1_to_Table2_Link L1 on L1.T1_ID = T1.ID
RIGHT JOIN TABLE2 T2 ON L1.T2_ID = T2.ID
INNER JOIN Table2_to_Table3_Link L2 ON L2.T2_ID = T2.ID
Right JOIN Table3 T3 ON L2.T3_ID = T3.ID
INNER JOIN Table1_to_Table3_Link L3 on T1.ID = L3.T1_ID
Немного неудобно объяснять, но в общем случае мне требуются все данные из таблицы 1 и только данные из таблиц 2 и 3, если они прямо или косвенно связаны с таблицей 1. Таблицы 2 и 3 не обязательно должны иметь связанные бизнес-концепция
Ожидаемое возвращение есть; Любая помощь будет принята с благодарностью
1 ответ
Решение
Ты был прав. Это было не так просто. Однако я мог получить желаемый результат по запросу ниже
SELECT
T1.*,
T2.*,
T3.*
FROM
Table1 T1
LEFT JOIN Table1_to_Table2_Link L1 on T1.ID = L1.T1_ID
LEFT JOIN TABLE2 T2 ON T2.ID = L1.T2_ID
LEFT JOIN (
SELECT T1_ID AS ID,T3_ID AS table3Id FROM dbo.Table1_to_Table3_Link
UNION ALL
SELECT T2_ID AS ID,T3_ID AS table3Id FROM dbo.Table2_to_Table3_Link
) S
ON T1.ID = s.ID
OR t2.ID = s.id
LEFT JOIN dbo.Table3 T3 ON S.table3Id = T3.ID
Надеюсь, поможет.