代码之家  ›  专栏  ›  技术社区  ›  Peter M

如何进行复杂的T-SQL更新查询?

  •  4
  • Peter M  · 技术社区  · 16 年前

    我有一个数据库表:

    Col1 | Col2 | Col3
    ------------------
      1  |   2  |  -
      2  |   3  |  -
      3  |   4  |  -
      4  |   5  |  -
    

    列1和列2有数据,但列3为空。

    我想实现的是 Col3 Col1 前一行的值(技术上是前一行,其中 COL1 值等于 Col2 值),以获取:

    Col1 | Col2 | Col3
    ------------------
      1  |   2  |  -
      2  |   3  |  1
      3  |   4  |  2
      4  |   5  |  3
    

    为了实现这一点,我正在为更新查询而苦苦挣扎。我一直在尝试这样的事情:

    UPDATE Table
    SET [cur].Col3 = [prev].Col1
    FROM Table [cur], Table [prev]
    WHERE [cur].Col1 = [prev].Col2
    

    但这似乎对我不起作用。SQL Server接受存储过程中的语法,但在执行时会生成一个错误:

    表不明确

    我做错什么了?


    注:

    每列中的数据都是唯一的,并且 COL1 COL2 是独一无二的。

    4 回复  |  直到 16 年前
        1
  •  1
  •   KM.    16 年前

    尝试:

    declare @yourTable table (col1 int, col2 int, col3 int)
    INSERT INTO @YourTable values (1,2,NULL)
    INSERT INTO @YourTable values (2,3,NULL)
    INSERT INTO @YourTable values (3,4,NULL)
    INSERT INTO @YourTable values (4,5,NULL)
    
    UPDATE cur
       SET cur.Col3 = prev.Col1
       FROM @YourTable           cur
           INNER JOIN @YourTable prev ON cur.col1=prev.col2
    
    select * from @YourTable
    

    输出:

    (1 row(s) affected)
    
    (1 row(s) affected)
    
    (1 row(s) affected)
    
    (1 row(s) affected)
    
    (3 row(s) affected)
    col1        col2        col3
    ----------- ----------- -----------
    1           2           NULL
    2           3           1
    3           4           2
    4           5           3
    
    (4 row(s) affected)
    
        2
  •  2
  •   Marc Gravell    16 年前
    UPDATE [cur] -- <<====== change here
    SET [cur].Col3 = [prev].Col1
    FROM Table [cur], Table [prev]
    WHERE [cur].Col1 = [prev].Col2
    
        3
  •  1
  •   HLGEM    16 年前
    UPDATE [cur] 
    SET [cur].Col3 = [prev].Col1
    FROM Table [cur]
    JOIN Table [prev] on [cur].Col1 = [prev].Col2
    

    请尝试开始使用连接语法而不是旧样式语法。您将有较少的问题,它将更容易维护,没有意外的交叉连接。左联接可以正常工作,因为它们现在不使用*=语法。此外,您还将更新1992年的标准。

        4
  •  0
  •   Anthony Faull    16 年前

    将第一行改为

    UPDATE [cur]