Это даст вам то, что вы хотите, основываясь на слоте вверх по поиску подробных таблиц.Честно говоря, я показываю этот код только потому, что он немного интересен.Обычно нет веских причин для выполнения этого типа запроса.
Для эффективности передачи, вероятно, было бы лучше не повторять данные в столбцах заголовка:
Header
Detail1
Detail2
Detail3
etc
SQL-запрос
DECLARE @MyHeader TABLE (HeaderPK int, Name varchar(100), Total smallmoney)
INSERT INTO @MyHeader (HeaderPK, Name, Total)
SELECT 1, 'ABC Company', 1600
DECLARE @MyDetail1 TABLE (Detail1PK int, HeaderFK int, Detail1Description varchar(100), Detail1Amount smallmoney)
INSERT INTO @MyDetail1 (Detail1PK, HeaderFK, Detail1Description, Detail1Amount)
SELECT 1, 1, 'Detail 1A', 100
UNION SELECT 2, 1, 'Detail 1B', 300
DECLARE @MyDetail2 TABLE (Detail2PK int, HeaderFK int, Detail2Description varchar(100), Detail2AmountA smallmoney, Detail2AmountB smallmoney)
INSERT INTO @MyDetail2 (Detail2PK, HeaderFK, Detail2Description, Detail2AmountA, Detail2AmountB)
SELECT 1, 1, 'Detail 2A', 100, 100
UNION SELECT 2, 1, 'Detail 2B', 200, 200
UNION SELECT 3, 1, 'Detail 3C', 300, 300
DECLARE @MyDetail3 TABLE (Detail3PK int, HeaderFK int, Detail3Description sysname)
INSERT INTO @MyDetail3 (Detail3PK, HeaderFK, Detail3Description)
SELECT 1, 1, 'Detail 3A'
UNION SELECT 2, 1, 'Detail 3B'
-- Returns 6 Rows, Expected 3
SELECT
MyHeader.*
,MyDetail1.*
,MyDetail2.*
,MyDetail3.*
FROM
@MyHeader MyHeader
LEFT JOIN
(SELECT *, RN=ROW_NUMBER() over (order by Detail1PK) FROM @MyDetail1) MyDetail1
FULL JOIN
(SELECT *, RN=ROW_NUMBER() over (order by Detail2PK) FROM @MyDetail2) MyDetail2
ON MyDetail1.HeaderFK = MyDetail2.HeaderFK AND MyDetail1.RN = MyDetail2.RN
FULL JOIN
(SELECT *, RN=ROW_NUMBER() over (order by Detail3PK) FROM @MyDetail3) MyDetail3
ON COALESCE(MyDetail1.HeaderFK, MyDetail2.HeaderFK) = MyDetail3.HeaderFK
AND COALESCE(MyDetail1.RN, MyDetail2.RN) = MyDetail3.RN
ON MyHeader.HeaderPK = COALESCE(MyDetail1.HeaderFK, MyDetail2.HeaderFK)
Вы расширяете подробные таблицы, добавляя больше в COALSECE, поэтому шестая подробная таблица будет иметь вид
FULL JOIN
(SELECT *, RN=ROW_NUMBER() over (order by Detail6PK) FROM @MyDetail6) MyDetail6
ON COALESCE(MyDetail1.HeaderFK, MyDetail2.HeaderFK, MyDetail3.HeaderFK,
MyDetail4.HeaderFK, MyDetail5.HeaderFK) = MyDetail6.HeaderFK
AND COALESCE(MyDetail1.RN, MyDetail2.RN, MyDetail3.RN, MyDetail4.RN, MyDetail5.RN) = MyDetail6.RN