仅当满足其他表中字段的值数量条件时,才更新表中的列

时间:2015-06-20 00:42:39

标签: sql oracle sql-update conditional

我想弄清楚如何实现以下目标。 (这是一个忽略/从非相关列中删除的简化版本。)

我有一个表项目,其中包含

item_id   product

我有另一张订单

order_id product item_id

这是问题陈述。

对于表中的给定 item_id ,在订单中查找只有一个与产品相关联的订单 table。
请注意,一个不同的产品可能意味着一行或多行用于产品 item_id 的独特组合。在这种情况下,我需要从订单表中获取产品,并使用该值更新商品表。

因此,如果订单表具有值

情景I
订单

order_id product  item_id
1        apple        12
2        apple        12

然后我需要使用“apple”更新项目表中的产品

情景II
但是,如果订单表具有值

order_id product item_id
1        apple        12
2        orange       12

没有什么需要做的。 商品表中的产品不需要更新。 (默认情况下为null。)。这是一次性数据修复。展望未来,Order和Item表之间的关系将由应用程序处理。在任何情况下,Order表中的产品都会在条件更新到Item表后保留。

这个问题的解决方案是什么?

2 个答案:

答案 0 :(得分:1)

这似乎符合要求:

UPDATE item_table i
SET i.product = 
  (SELECT
    MIN(o.product)
   FROM order_table o
   WHERE i.item_id = o.item_id
   GROUP BY o.item_id
   HAVING COUNT(DISTINCT o.product) = 1
  )
WHERE i.product IS NULL
;

查看实际操作:SQL Fiddle 如果需要调整/进一步详细说明,请发表评论。

答案 1 :(得分:0)

update Items i
set i.product = (select max(o.product) from Orders o where o.item_id = i.item_id)
where 1 = (
  select count(distinct o.product)
  from Orders o
  where o.item_id = i.item_id
)

注意:我认为您对帖子的一些混淆与您使用unique这个词有关。我认为您的意思是使用distinct这个词。

所以当你说:

  

对于Item表格中的给定item_id,在订单表格中查找只有一个与唯一产品相关联的订单。

我想你想说:

  

对于Item表格中的给定item_id,在订单表中查找只有一个与不同产品相关联的订单。