关于#Update结合SELECT#的问题,如何解决?

UPDATE Purch_Pay SET SN = Table1.row_number
    FROM    (SELECT TOP 100 PERCENT row_number()over (ORDER BY PayDate) row_number,PayDate,VendorID,PurchID,PayMoney,Note_number     FROM Purch_Pay ORDER BY PayDate) Table1
    WHERE  Table1.VendorID = Purch_Pay.VendorID   AND Table1.PayDate = Purch_Pay.PayDate   AND  Table1.PurchID = Purch_Pay.PurchID   AND Table1.PayMoney = Purch_Pay.PayMoney   AND Table1.Note_number = Purch_Pay.Note_number;

加点缩进啊,都写一起了

WITH CTE AS (
    SELECT 
        row_number() OVER (ORDER BY PayDate) AS row_number,
        PayDate,
        VendorID,
        PurchID,
        PayMoney,
        Note_number
    FROM Purch_Pay
)
UPDATE p
SET p.SN = c.row_number
FROM Purch_Pay p
JOIN CTE c ON c.VendorID = p.VendorID
    AND c.PayDate = p.PayDate
    AND c.PurchID = p.PurchID
    AND c.PayMoney = p.PayMoney
    AND c.Note_number = p.Note_number;

啥问题 ??

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 文章:select for update是属于排他锁,也属于悲观锁 中也许有你想要的答案,请看下吧
  • 除此之外, 这篇博客: 数据库系统原理课程总结4——视图(分类,删改权限),用户权限,用户定义完整性约束并命名中的 3) 为不同的用户授予和收回属性列级的SELECT, INSERT, UPDATE的权限 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    对不同的用户授予属性列级的SELECT, INSERT, UPDATE的权限:
    在这里插入图片描述输出用户权限如下:
    在这里插入图片描述
    在这里插入图片描述

    收回之前授予的权限:
    在这里插入图片描述
    收回之后的用户权限输出如下:
    在这里插入图片描述
    在这里插入图片描述

    通过命令行指令,使用定义的用户进入数据库进行操作,下图为使用u2进入数据库之后对回答ID为2的回答的文本进行修改,因为没有select权限所以无法输出:
    在这里插入图片描述

  • 以下回答来自chatgpt:

    在SQL中,我们可以使用子查询来在UPDATE语句中使用SELECT查询的结果来更新表中的数据。以下是具体的解决方法:

    1. 首先,编写一个SELECT语句,该语句将返回我们想要用于更新的数据。例如,我们可以使用以下查询语句来获取需要更新的数据:
    SELECT column1, column2, ... FROM table_name WHERE condition;
    

    请将column1, column2, ...替换为要更新的列的名称,table_name替换为表的名称,condition替换为筛选条件。

    1. 编写一个UPDATE语句,该语句将使用上一步中的SELECT语句的结果来更新表中的数据。例如,我们可以使用以下UPDATE语句来更新表的数据:
    UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;
    

    请将table_name替换为表的名称,column1 = value1, column2 = value2, ...替换为要更新的列及其对应的新值,condition替换为筛选条件。

    1. 通过在UPDATE语句的SET子句中使用子查询,将上一步中的SELECT语句嵌套进来。例如,我们可以使用以下UPDATE语句来将SELECT语句的结果用于更新表的数据:
    UPDATE table_name
    SET column1 = (
      SELECT column1 FROM table2_name WHERE condition
    ), 
    column2 = (
      SELECT column2 FROM table2_name WHERE condition
    ), 
    ...
    WHERE condition;
    

    请将table_name替换为表的名称,column1, column2, ...替换为要更新的列的名称,table2_name替换为包含我们想要引用的数据的表的名称,condition替换为筛选条件。

    1. 运行上述UPDATE语句,它将使用SELECT查询的结果来更新表中的数据。

    请注意,为了确保子查询返回的结果与UPDATE语句联合使用时的数据一致,我们可以在子查询的末尾添加FOR UPDATE子句,这将为子查询的结果设置排它锁,以确保其他事务无法修改这些数据。例如:

    SELECT column1, column2, ... FROM table_name WHERE condition FOR UPDATE;
    

    以上是使用SELECT语句来更新表中数据的方法。希望对您有所帮助!如果还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^