我想找到彼此相似的行,如果行有任何类似的行,则更新字段。我的表看起来像这样:
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
答案 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
。