我是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”附近的语法不正确。
答案 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
此外,按照您使用ROW_NUMBER
的方式,它实际上是行号与RANK
。如果您想要排名(有潜在关系),请将ROW_NUMBER
替换为RANK
。