使用ROW_NUMBER初学SQL查询

时间:2013-02-23 14:10:42

标签: sql sql-server

我是SQL的初学者。

现在我正在尝试创建一个复杂的选择,但是我遇到了一些错误,我知道这是一个初学者的错误。

任何帮助表示感谢。

SELECT ROW_NUMBER() OVER (ORDER BY score) AS rank, userID, facebookID, name, score FROM (
    SELECT * FROM Friends  AS FR WHERE userID = ? 
    JOIN 
    Users WHERE Users.facebookID = FR.facebookFriendID
) 
UNION (
    SELECT * FROM User WHERE userID = ?
)

哪里2?将替换为我的用户ID。

表User包含我的数据库中的每个用户,而Friends表包含用户的所有facebookFriends。

USER TABLE
userID | facebookID | name | score

FRIENDS TABLE 
userID | facebookFriendID

示例数据

USER

A | facebookID1 | Alex | 100
B | facebookID2 | Mike | 200

FRIENDS

A | facebookID2 
A | facebookID3
B | facebookID1

我喜欢这个结果,因为Alex和迈克是朋友:

rank | userID | facebookID  | name
1    | B      | facebookID2 | Mike
2    | A      | facebookID1 | Alex

我希望这是非常明确的解释。

我现在收到此错误:

  

执行查询时出错:关键字“AS”附近的语法不正确。

1 个答案:

答案 0 :(得分:1)

您的查询存在多个问题。 JOINS来自WHERE条款。使用JOIN时,您需要指定ON子句。此外,在使用UNION时,您需要确保在两个查询中都返回相同数量的字段。

尝试一下:

SELECT ROW_NUMBER() OVER (ORDER BY score) AS rank, userID, facebookID, name, score 
FROM ( 
    SELECT * 
    FROM Users
    WHERE UserId = 'A'
    UNION 
    SELECT U.userId, u.facebookId, u.name, u.score 
    FROM Friends FR 
        JOIN Users U ON U.facebookID = FR.facebookFriendID 
    WHERE FR.userID = 'A' ) t

SQL Fiddle Demo

此外,按照您使用ROW_NUMBER的方式,它实际上是行号与RANK。如果您想要排名(有潜在关系),请将ROW_NUMBER替换为RANK