2013-08-29 64 views
2

也許我有這個錯誤,但我認爲這個查詢會使用遞歸,但我似乎無法正確寫入它。下面是樣本數據:不正確的遞歸查詢?

DECLARE @Friends TABLE 
(
[person_id] [int] NOT NULL, 
[first_name] [varchar](50) NOT NULL, 
[favorite_color] [varchar](50) NOT NULL, 
[best_friend] [varchar](50) NOT NULL 
) 

INSERT @Friends VALUES (1, 'John', 'blue', 'Mark') 
INSERT @Friends VALUES (2, 'Mark', 'green', 'Sally') 
INSERT @Friends VALUES (3, 'David', 'purple', 'John') 
INSERT @Friends VALUES (4, 'Sally', 'red', 'Rose') 
INSERT @Friends VALUES (5, 'Stephanie', 'blue', 'Rose') 
INSERT @Friends VALUES (6, 'Rose', 'yellow', 'David') 

現在我需要在第一列中列出每個人的名字,那麼他們最好的朋友在第二喜歡的顏色。

我的想法是使用cte,初始化查詢會得到名稱列表,遞歸會得到他們最好的朋友顏色。

但是現在我不確定如何編寫遞歸部分以找到最好的朋友顏色?

不尋找任何人做我的家庭作業,只是試圖走向正確的方向。

TIA

+1

如果這是你所需要的,你不需要使用遞歸。是否使用賦值的遞歸部分? – SWeko

+0

不!我只是想用最好的方法。我可以用一個簡單的子查詢來做到這一點。 – GPGVM

回答

4

你不需要遞歸,你不需要子查詢。所有你需要的是簡單的加入:

SELECT f.*, bf.favorite_color AS BF_favorite_color 
FROM @Friends f 
LEFT JOIN @Friends bf ON f.best_friend = bf.first_name 

SQLFiddle DEMO

+0

正確!因爲左連接將與右表中的記錄匹配。我絕對是在想這個。 – GPGVM

+0

@ user1278561無需使用LEFT或RIGHT加入。由於您的best_friend列不是NULL,因此您可以使用(INNER)JOIN。 LEFT/RIGHT JOIN適用於當您想要顯示其中一個表格的記錄時,即使它們在您要加入的表格中沒有匹配的記錄。 – Sam