代码之家  ›  专栏  ›  技术社区  ›  Andreas Niedermair

如何递归更新SQL Server中的组

  •  0
  • Andreas Niedermair  · 技术社区  · 15 年前

    我正在使用SQL Server 2008。

    以下数据池:

    PK  Col1        Col2
    1   SomeValue1  DataToTake1
    2   SomeValue1
    3   SomeValue1
    4   SomeValue1
    5   SomeValue2  DataToTake2
    6   SomeValue2
    ...
    

    我想插入 DataToTake1 进入之内 Col2 记录与 PK 2、3、4和 DataToTake2 进入之内 COL2 有记录的 PK 6。
    更明显的是:记录 PK 1-4为组,表示为 Col1
    另一个信息: PK 可能不是增量的,也不是在生产系统上排序的(但是我们可以根据 第1列 希望不会有问题)。

    使用SQL Server有什么方法可以做到这一点吗?(一个同伴用一个指针实现了这个…ARGGGH

    编辑
    谢谢你的回答,但我必须修改我的请求,因为我的初始情况发生了变化:我需要考虑pk。如。

    PK  Col1        Col2
    1   SomeValue1  DataToTake1
    2   SomeValue1
    4   SomeValue1
    5   SomeValue2  DataToTake2
    6   SomeValue2
    9   SomeValue1
    

    如何只更新排序行?在这个例子中,pk 1=2=4

    3 回复  |  直到 15 年前
        1
  •  1
  •   DeanM    15 年前

    我想您必须使用临时桌位:

    创建表datatotake( seq int非空标识(1,1) pk_s int不为空,—将其设置为与数据池中的pk相同的类型 pk_e int NULL,—将此设置为与数据池中的pk相同的类型 col1 varchar(20)NULL,--将其设置为与数据池中的col1相同的类型 col2 varchar(20)NULL--将其设置为与数据池中的col2相同的类型 )

    插入datatotake (pk_s,col1,col2) 选择pk、col1、col2 从数据仓库 其中col2不为空 PK订单

    更新datatotake集 pk_e=dtt2.pk_s 从datatotake inner join datatotake dtt2 on #datatotake.seq=dtt2.seq-1

    更新datatotake集 pk_e=(从数据池中选择max(pk)+1) 其中pk_s=(从datatotake中选择max(pk_s)

    更新数据池集 COL2= DTT.COL2 从数据池内部联接数据启动DTT 数据池.pk>dtt.pk_s 和datapool.pk<dtt.pk\u e 和datapool.col1=dtt.col1

    删除表datatotake

        2
  •  2
  •   gbn    15 年前
    UPDATE
       D1
    SET
       Col2 = D2.Col1
    FROM
       dataPool D1
       JOIN
       dataPool D2 ON D1.col1 = D2.col1
    WHERE
       D1.col2 <> D2.col2 OR D1.col2 IS NULL
    
        3
  •  1
  •   kevchadders    15 年前
    -- Select the top 1 value which has data, and matches whats in Col1
    UPDATE dataPool
    SET Col2 = (SELECT TOP 1 t3.Col2 
                FROM dataPool t3 
                WHERE t3.col1 = t2.col1 
                AND t3.Col2 IS NOT NULL) -- 
    FROM dataPool t2
    WHERE t2.Col1 = Col1
    AND col2 IS NULL -- Only update Rows with NULLs in