2017-07-06 38 views
2

MS SQL Server 2008 - 我有一個數據庫表,其中我有一小部分行具有近似匹配,保存爲2列,在表中的其他地方。你將如何構造SQL更新循環來遍歷子集(record1)並搜索其匹配對象(record2),然後從列(record2.columnX)複製一個值來更新其他(record1.columnX)?如何使用其他記錄更新sql中的記錄作爲值?

前:

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。耐心感謝。

+3

你總是螞蟻保持最低'ColumnX'值嗎?第一個值? – Jacobm001

+0

不一定。他們只需要匹配。 ColumnX是鏈接下游系統中兩條記錄的鏈接。 – MBoucher

回答

1

上分(TxID添加)組內加入recordId所

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 
+1

@ Jacobm001應該保留ColumnX for min(TxID)...對於每個reecordID – scaisEdge

+0

啊,你是對的;我現在看到了。 – Jacobm001

0

我會做這樣的事情你可以使用一個更新:

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; 
+0

感謝您的回答。這是否假設數據位於兩個單獨的表格中? – MBoucher

+0

不,實際上只需要一個表就可以實現,只是別名不同。 –

+0

我的歉意,我明白你現在如何組織事物。這完全按照需要工作。謝謝。 – MBoucher

0

另一種方式來做到這一點:

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 
+0

感謝您提供兩種解決方案。這是否假設記錄在單獨的表格中(t1和t2)?在我的例子中,所有的記錄都在同一個表中。 – MBoucher

+0

@mboucher否,它假定所有記錄都在1個表中。 T1和T2只是同一個表的別名,但您需要兩個別名,以便您可以將表連接到它自己。希望這是明確的。在我的例子中,唯一使用的表叫做'@ table' – Icarus