2017-01-27 5 views
1

У меня есть эти буксировочные столы. Пункты в колонке 2 таблицы 1 также может быть связан с другими предметами и их отношения в таблице 2.Как получить желаемую таблицу с рекурсивным запросом

t1 Code_A|Code_B t2 Code_B|Code_C 
    ------+------  ------+------ 
    788 | 501  501 | 503 
    788 | 510  503 | 507 
    ... | ...  501 | 504 

Как я могу получить таблицу 1 в качестве этого результата с помощью рекурсивного запроса в SQL Server.

result Code_A|Code_B 
     ------+------  
     788 | 501  
     788 | 503   
     788 | 507 
     788 | 504 

Edited

ответ

3

попробовать с Recursive CTE:

DECLARE @t1 TABLE (Code_A INT, Code_B INT) 
DECLARE @t2 TABLE (Code_B INT, Code_C INT) 


INSERT @t1 VALUES (788, 501), (788, 510) 
INSERT @t2 VALUES (501, 503), (503, 507) 


;WITH cte(code_A, code_B) 
AS (
    SELECT t1.code_A, t1.code_B 
    FROM @t1 t1 
    LEFT JOIN @t2 t2 ON t2.Code_B = t1.Code_B 
    UNION ALL 
    SELECT c.code_A, t2.code_C 
    FROM cte c 
    INNER JOIN @t2 t2 ON t2.Code_B = c.code_B 
) 
SELECT DISTINCT * FROM cte 

результат:

code_A  code_B 
----------- ----------- 
788   510 
788   501 
788   503 
788   507 
+1

работает как шарм с заданным желаемым выходом. Но поскольку он писал *, может быть связано *, возможно, он также хочет «788, 510» (с предположением, что 510 нет в t2), но просто не включил его, чтобы сохранить образец коротким. Предложите добавить отдельный случай для этого вывода, если это то, чего хочет OP. – user1429080

+0

@stephen спасибо за ваш ответ, но, как я вижу сейчас, я хочу что-то немного отличающееся от того, что я спросил, и я редактировал свой вопрос. В таблице 2 некоторые Коды в столбце Code_B my повторяются, поэтому с приведенным выше кодом одни и те же строки в таблице результатов будут повторяться несколько раз. Я думаю, добавив «Distinct» в последнюю строку, проблема будет решена. –

+0

@ user1429080 Да. Я тоже хочу '788, 510' И чтобы увидеть это, я могу заменить' inner join' на 'left join' в первой части рекурсивного запроса. –