根据Oracle SQL中多个其他行的值更新行

时间:2014-05-03 12:23:09

标签: sql oracle sql-update row

我想找到彼此相似的行,如果行有任何类似的行,则更新字段。我的表看起来像这样:

OrderID  |  Price  | Minimum Number | Maximum Number | Volume | Similar 
1         45        2                 10                250        0  
2         46        2                 10                250        0   
3         60        2                 10                250        0

"类似的"在此上下文中表示具有相同最大数量,最小数量和卷的行。价格可以不同,但​​差异最多可以是2.

在此示例中,OrderID为1和2的订单类似,但3没有类似的行(因为即使它具有相同的最小数量,最大数量和数量,但其价格不在订单1的2个单位内和2)。

然后,我想更新字段"类似"对于订单1和2,从默认值(0)到1.因此,上面示例的输出将是:

OrderID  |  Price  | Minimum Number | Maximum Number | Volume | Similar 
1         45        2                 10                250        1
2         46        2                 10                250        1
3         60        2                 10                250        0

1 个答案:

答案 0 :(得分:1)

这是一种ANSI标准SQL的方法,它可以在大多数数据库中使用,包括Oracle。它实现了您使用相关子查询设置的逻辑:

update table t
    set similar = 1
    where exists (select 1
                  from table t2
                  where t2.minimum = t.minimum and
                        t2.maximum = t.maximum and
                        t2.volume = t.volume and
                        abs(t2.price - t.price) <= 2 and
                        t2.OrderId <> t.OrderId
                 );

编辑:

在我看来,&#34;类似的&#34;字段可能是类似字段的最小OrderId。您可以将上述想法扩展到:

update table t
    set similar = (select min(orderId)
                   from table t2
                   where t2.minimum = t.minimum and
                         t2.maximum = t.maximum and
                         t2.volume = t.volume and
                         abs(t2.price - t.price) <= 2 and
                         t2.OrderId <> t.OrderId
                  )
    where exists (select 1
                  from table t2
                  where t2.minimum = t.minimum and
                        t2.maximum = t.maximum and
                        t2.volume = t.volume and
                        abs(t2.price - t.price) <= 2 and
                        t2.OrderId <> t.OrderId
                 );

虽然如果是这种情况,默认值应为NULL而不是0