SQL自联接问题

时间:2012-02-14 04:36:16

标签: sql sql-server-2008

我有两个表需要从中获取数据...我的用户表看起来像这样:

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

UserID引用了Users表中的UserID,AlternateUserID也是如此。在这种情况下,我们的程序可以拥有与其他用户“交替”的用户。所以在上面的例子中,如果John Brown有Mark&蒂姆作为替代者,马克将约翰作为替补,而时间将马克和约翰作为替补。我在如何编写SQL以显示给定用户标识的备用用户时画了一个空白。因此,如果我传入UserID = 1,它将返回:

2, Mark, Smith
3, Tim, Stone

我尝试了这个,但它返回了2行相同的用户数据(在这种情况下,2 John Brown's):

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

有什么想法吗?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

这样的东西
SELECT  u.*
FROM    UserAlternates ua   INNER JOIN
        Users u ON  ua.AlternateUserID = u.UserID
WHERE   ua.UserID = @UserID 

由于UserAlternates表已经包含原始UserID,因此您的请求似乎不需要两次加入Users表。

答案 2 :(得分:1)

你有错误的表别名:

WHERE ua.UserID = @UserID

注意: ua 不是你。

答案 3 :(得分: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