问题描述
DECLARE @value int;
SET @value = (SELECT *
FROM
(SELECT
ROW_NUMBER() OVER (ORDER BY ID ASC) AS rownumber
FROM
(SELECT ID FROM Users
WHERE ID NOT IN (SELECT UserID FROM UserFavoritePlaces))
) AS foo
WHERE rownumber = 1)
但是我遇到了语法错误
消息 102,级别 15,状态 1,第 31 行
')' 附近的语法不正确
我不知道我做错了什么。
解决方法
您的查询过于复杂。您可以将此方法用作:
SELECT @value = id
FROM (SELECT u.*,ROW_NUMBER() OVER (ORDER BY ID ASC) AS rownumber
FROM Users
WHERE u.ID NOT IN (SELECT ufp.UserID FROM UserFavoritePlaces ufp)
)
WHERE rownumber = 1;
但它可能更简单:
SELECT @value = id
FROM Users
WHERE u.ID NOT IN (SELECT ufp.UserID FROM UserFavoritePlaces ufp)
ORDER BY id
OFFSET 0 FETCH FIRST 1 ROW ONLY;
实际上,对于您尝试的逻辑,最简单的形式是:
SELECT @value = 1;
您正在将值设置为行号。如果这是您的意图,那么 EXIST
通常是更好的方法。
略有不同的布局,语法错误的原因变得清晰...
Declare @value int;
SET @value=
(
SELECT
*
FROM
(
SELECT
ROW_NUMBER() OVER (ORDER BY ID ASC) AS rownumber
FROM
(
SELECT
ID
FROM
Users
WHERE
ID NOT IN (SELECT UserID FROM UserFavoritePlaces)
)
-- NO TABLE ALIAS HERE
)
AS foo
WHERE
rownumber =1
)
此外,您的 foo
表仅有 rownumber
列。因此,即使它执行了,它也会始终返回 1
。
我会做...
SELECT
@value = MIN(ID)
FROM
Users
WHERE
ID NOT IN (SELECT UserID FROM UserFavoritePlaces)