2011-06-17 11 views
2

のための共通テーブル式Iは、以下の方法で二つのテーブルのテーブルAとテーブルBを持っている:、Googleの面接の質問:再帰クエリまたは次のシナリオ

テーブルA(Xを言う)、 からIDを指定
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 

のidを探し、前のペアメイトのグループメイト を探し、前のステップで見つかったすべてのものの とそのグループメイト(前のステップで見つかったすべてのもの)とそう...。 あなたがどんな仲間やグループメイトも見つけられなくなるまで。

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 
+0

わかりました...ので、あなたは疑問を持っているのですか? –

+0

これについてCTEをどのように記述したいと思いますか? – vinayvasyani

答えて

0
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