【问题标题】:How do I update records in sql using other records as values?如何使用其他记录作为值来更新 sql 中的记录?
【发布时间】:2017-07-06 18:04:50
【问题描述】:

MS SQL Server 2008 - 我有一个 db 表,其中我有一小部分行接近匹配,除了 2 列,在表的其他地方。你将如何构建一个 SQL 更新循环来遍历子集 (record1) 并搜索其匹配的对应项 (record2),然后从列 (record2.columnX) 复制一个值以更新另一个 (record1.columnX)?

之前:

TxID|RecordID|ColumnA|ColumnX|ColumnY    
1   |111.222 |ggg    |1234   |subset1
2   |111.222 |ggg    |3456   |subset2
3   |111.333 |hhh    |6789   |subset1
4   |111.333 |hhh    |7890   |subset2
5   |111.444 |jjj    |2345   |subset1
5   |111.444 |jjj    |5678   |subset2

之后:

TxID|RecordID|ColumnA|ColumnX|ColumnY    
1   |111.222 |ggg    |1234   |subset1
2   |111.222 |ggg    |1234   |subset2
3   |111.333 |hhh    |6789   |subset1
4   |111.333 |hhh    |6789   |subset2
5   |111.444 |jjj    |2345   |subset1
5   |111.444 |jjj    |2345   |subset2

自学成才,对 SQL 比较陌生。耐心是值得的。

【问题讨论】:

  • 你总是想保持最低的ColumnX 值吗?第一个值?
  • 不一定。他们只需要匹配。 ColumnX 将下游系统中的两条记录链接起来。

标签: sql sql-server


【解决方案1】:

您可以通过 RecordID 对 min(TxID) 组使用内部联接的更新

  update my_table t1
  inner join 
  (
      select RecordID, ColumnA, ColumnX, ColumnY
      from my_table 
      where (TxID, RecordID ) in (
        select min(TxID), RecordID 
      from my_table 
      group by RecordID) 
  ) ttt on ttt.RecordID = t1.RecordID  
  set  t1.ColumnX = ttt.ColumnX

【讨论】:

  • @Jacobm001 应该保留 ColumnX for min(TxID) ... 对于每个记录 ID
【解决方案2】:

我会这样做:

UPDATE table t1 SET columnX=sq.columnXmin
FROM  (
   SELECT t2.RecordID, MIN(t2.columnX) as columnXmin
   FROM   table t2
   GROUP  BY t2.RecordID
   ) AS sq
WHERE  t1.RecordID = sq.RecordID;

【讨论】:

  • 感谢您的回答。这是否假设数据位于两个单独的表中?
  • 不,实际上你只需要一张表就可以实现,只是别名不同。
  • 抱歉,我了解您现在的结构。这完全符合需要。谢谢。
  • 太棒了!我很高兴你发现它很有帮助!你能给我点赞吗? :)
【解决方案3】:

另一种方法:

UPDATE  t1
SET     t1.ColumnX = t2.ColumnX
FROM    @table t1
        INNER JOIN @table t2 ON t1.RecordID = t2.RecordID
                                AND t1.ColumnA = t2.ColumnA
                                AND t1.ColumnY <> t2.ColumnY
                                AND t1.TxID > t2.TxID -- the lowest TxID keeps its original value

或者……

UPDATE  t1
SET     t1.ColumnX = t2.ColumnX
FROM    @table t1
        INNER JOIN @table t2 ON t1.RecordID = t2.RecordID
                                AND t1.ColumnA = t2.ColumnA
                                AND t1.ColumnY <> t2.ColumnY
                                AND t1.TxID < t2.TxID -- the largest TxId keeps its original value

【讨论】:

  • 感谢您提供这两种解决方案。这是否假设记录在单独的表中(t1 和 t2)?在我的例子中,所有记录都在同一个表中。
  • @mboucher 不,它假定所有记录都在 1 个表中。 T1 和 T2 只是同一个表的别名,但您需要两个别名,以便您可以将表连接到自身。希望这很清楚。在我的示例中,唯一使用的表称为 @table
猜你喜欢
  • 1970-01-01
  • 2014-01-21
  • 2014-09-01
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
相关资源
最近更新 更多