【问题标题】:How to set variable from nth row of SQL query如何从 SQL 查询的第 n 行设置变量
【发布时间】:2020-12-22 16:03:52
【问题描述】:

我对 SQL 有点陌生,我想从这样的查询中设置一个变量:

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 行
')' 附近的语法不正确

而且我不知道我做错了什么。

【问题讨论】:

    标签: sql sql-server-2017


    【解决方案1】:

    您的查询过于复杂。您可以将此方法用作:

    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 通常是更好的方法。

    【讨论】:

    • 为了清晰起见(求朋友,老实说)OFFSET 0 FETCH FIRST 1 ROW ONLY 与使用MIN() 相比有什么物质优势吗?
    • @MatBailie 。 . .该问题建议获取第 n 行。碰巧n = 1,但为了以防 OP 想要一个更一般的答案,我使用了offset/fetch
    • 我的目标是创建一个 for 循环来将值添加到 Userfavoriteplaces 表中,该 ID 存在于 users 表中但不存在于 userfavoriteplaces 表中,并且每次将行号加一
    • @Himelu5 。 . .这回答了您在这里提出的问题。如果您还有其他问题,请将其作为问题提出,并附上适当的样本数据、期望的结果和解释。
    • @Himelu5 我几乎可以保证你不需要循环,它会很慢而且很笨重,而且它可以作为一个单一的INSERT (对于两者很多用户,每个用户有很多地方)。我强烈建议开始第二个问题,显示两个表的一些示例数据,以及表的所需最终状态。
    【解决方案2】:

    布局稍有不同,语法错误的原因就清楚了……

    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)
    

    【讨论】:

      猜你喜欢
      • 2011-04-27
      • 2019-08-16
      • 2022-09-28
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 2015-06-27
      • 2011-11-09
      相关资源
      最近更新 更多