2012-02-14 61 views
0

我有2個表,我需要得到的數據...我的用戶表看起來像這樣:SQL自聯接問題

Users Table 
------------- 
UserID 
FirstName 
LastName 
WebLogin 
WebPassword 
Active 

UserAlternates Table 
--------------------- 
UserAlternateID 
UserID 
AlternateUserID 

Users Table Data 
------------------ 
1, John, Brown, jbrown, jbrown, true 
2, Mark, Smith, msmith, msmith, true 
3, Tim, Stone, tstone, tstone, true 

UsersAlternate Table Data 
-------------------------- 
1, 1, 2 
2, 1, 3 
3, 2, 1 
4, 3, 2 
5, 3, 1 

的用戶名是指返回到用戶表,因此用戶ID執行AlternateUserID。這是我們的程序可以讓用戶對其他用戶「交替」的情況。因此,在上面的例子中,如果約翰布朗將Mark添加爲替代項,並且Mark將John替換爲替代項,而時間將以Mark和John替代。我在如何編寫SQL以顯示給定用戶標識的備用用戶方面留下了一片空白。所以,如果我在用戶名= 1後,它會返回:

2, Mark, Smith 
3, Tim, Stone 

我試過,但它返回兩行相同的用戶數據(在這種情況下,2約翰·布朗的):

CREATE  PROCEDURE [dbo].[GetUserAlternates] 
@UserID int 

AS 
SELECT u.FirstName, u.LastName, ua.AlternateUserID 
FROM Users u 
INNER JOIN UserAlternates ua ON u.UserID = ua.AlternateUserID 
WHERE u.UserID = @UserID 

有任何想法嗎?

+0

您需要再次加入到用戶表。 – 2012-02-14 04:41:10

+0

@John選擇你爲什麼需要加入兩次用戶?用戶表中包含的關於不在useralternates表中的userid 1的信息是什麼? – 2012-02-14 04:46:29

+0

我想我錯了。 – 2012-02-14 04:48:05

回答

1

如何像

SELECT u.* 
FROM UserAlternates ua INNER JOIN 
     Users u ON ua.AlternateUserID = u.UserID 
WHERE ua.UserID = @UserID 

它似乎並沒有從你的要求,你需要加入到用戶表的兩倍,作爲UserAlternates表已經包含了原來的用戶名。

+0

這是完美的......感謝一大堆,我的大腦在這一刻變得如此之多,所以這幫了我很大的忙! – Robert 2012-02-14 04:57:19

2
CREATE PROCEDURE dbo.GetUserAlternates 
    @UserID INT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT u.FirstName, u.LastName, u.UserID 
     FROM dbo.Users AS u 
     INNER JOIN dbo.UserAlternates AS au 
     ON u.UserID = ua.AlternateUserID 
    WHERE ua.UserID = @UserID; -- key difference here! 
END 
GO 
0
SELECT ua.AlternateUserID, U2.FirstName, U2.Lastname 
FROM Users u 
    INNER JOIN UserAlternates ua ON u.UserID = ua.UserID 
    INNER JOIN Users U2 on U2.UserID = UA.AlternateUserID 
WHERE u.UserID = @UserID 
+1

爲什麼你需要加入兩次用戶? – 2012-02-14 04:56:05

1

你打錯了表的別名:

WHERE ua.UserID = @UserID 

注:UA爲u。