SQL Update语句 - 基于非唯一记录更新行

时间:2014-10-09 20:58:08

标签: sql oracle

我在Oracle db中有一个包含3列的表,如下所示

DealID  ---TradeID  -----LinkedID

10000 -------1   ------------Null

10000 -------2   ------------Null

10001 -------3   ------------Null

10001 -------4   ------------Null

我想编写一个SQL语句来更新链接的id列,以返回以下更新的表

DealID  ---TradeID  -----LinkedID

10000 -------1   -----------2

10000 -------2   -----------1

10001 -------3   -----------4

10001 -------4   -----------3

对于每个交易ID和交易ID组合,找到也链接到该交易ID的其他交易ID,并使用此值作为链接ID更新记录。 每笔交易ID都有2个不同的交易ID。 (贸易ID是独一无二的)

2 个答案:

答案 0 :(得分:1)

您可以使用相关更新:

update
    table
set
    LinkedID = (
        select 
            TradeID 
        from 
            table t 
        where 
            table.DealID = t.DealID and 
            table.TradeID != t.TradeID
    )

Example SQLFiddle

答案 1 :(得分:1)

UPDATE table_name dest
   SET linkedID = (SELECT src.tradeID
                     FROM table_name src
                    WHERE src.dealID = dest.dealID
                      AND src.rowid != dest.rowid )

将更新表格中的每一行。这假定每个dealID在表中只有两个tradeID行。

从数据模型的角度来看,这种交叉链接似乎存在问题。我强烈建议对数据进行规范化。听起来交易与交易相关联,因此可能应该有deal表,trades表和1:n表来链接交易与交易。