Google Interview Question: рекурсивный запрос или общее табличное выражение для следующего сценария - PullRequest
2 голосов
/ 17 июня 2011

У меня есть две таблицы TableA и TableB следующим образом:

Table A(ID, PairId)
--Here the Pair represented by PairId will always have 2 elements in it.

Data:
100,1
101,1
----- 
104,2
109,2



TableB(A.ID, GroupId)
--Here the Group represented by GroupId will may have any number of elements. 
--Also, A.ID means its a foriegn key from TableA
Data:
100,1000
102,1000
103,1000
--------
101,1001
104,1001
105,1001
-------
105,1002
106,1002
107,1002

Учитывая идентификатор из таблицы A (скажем, X), Найдите идентификаторы своих партнеров, а затем одноклубники (из предыдущих парных товарищей) а затем и партнеров (из всех, которые мы нашли в предыдущем шаге) и их одногруппники (из всех, которые мы нашли в предыдущем шаге) и так далее .... пока вы не найдете парных или одноклассников.

For instance, given X as 100
you will accumulate data in this fashion:

Include PairMates
100
101

Include GroupMates(of all the ones in prevstep)
100--groupmates of 100
102
103
101--groupmates of 101
104
105

Include PairMates(of all the ones in the prevstep)
100
102
103
101
104--Pairmate of 104
109
105

Include Groupmates(of all the ones in the prev step)
100
102
103
101
104
109
105--Groupmates of 105
106
107

Include Pairmates( of all the ones in the prevstep)
100
102
103
101
104
109
105
106
107
[None found]
Include Groupmates( of all the ones in the prevstep)
100
102
103
101
104
109
105
106
107
[Nonefound]
---since no pairmates and groupmates were added so the recursion ends

1 Ответ

0 голосов
/ 24 октября 2015
DECLARE @ID INT  = <Given ID>

WITH CTE AS
(
SELECT * FROM TABLEB 
WHERE ID IN (SELECT ID FROM TABLEA WHERE pairID IN (SELECT pairId FROM TABLEA WHERE ID = @ID)) 
UNION 
SELECT * FROM TABLEB WHERE GroupID IN (SELECT GroupID FROM CTE)
)
SELECT * FROM CTE
...