更新一对多关系

时间:2016-07-26 18:00:49

标签: database relational-database postgresql-9.3

在3个表之间的两个一对多关系中,我需要一些帮助来更新数据库中的某些字段。

我的当前设置farmer有许多box,其中包含许多fruits

每个农民都有几天的保证期(一个整数列),每个水果都有一个到期日(取决于交货期NOW() - fruit.expiry_date > farmer.days

我的目标是将该框设置为已过期,但前提是该框中的所有水果都已过期。

这就是我最终的目标:

UPDATE
    boxes
SET
    expired = true
WHERE id IN (
    SELECT
        boxes.id
    FROM
        fruit, boxes, farmer
    WHERE
        fruit.box_id = boxes.id AND
        boxes.farmer_id = farmer.id AND
        DATE_PART('day', now() - fruit.expiry_date) > farmer.waranty_days AND
        boxes.expired = FALSE
)

问题是我遇到了困难,并且不知道如何排除没有过期所有果实的盒子。 我还试图添加一个计数,然后离开加入结果,但它仍然无法正常工作。

欢迎任何建议。

1 个答案:

答案 0 :(得分:0)

另一种思考问题的方法是,您要识别不含新鲜水果的盒子。尝试这样的事情:

UPDATE boxes
INNER JOIN farmer ON boxes.farmer_id = farmer.id
SET boxes.expired = true
WHERE NOT boxes.expired
AND NOT EXISTS (
  SELECT 1
  FROM fruit
  WHERE boxes.id = fruit.box_id
  AND DATE_PART('day', now() - fruit.expiry_date) <= farmer.waranty_days
)

另一个应该做同样事情的查询:

UPDATE boxes
INNER JOIN farmer ON boxes.farmer_id = farmer.id
LEFT JOIN fruit ON boxes.id = fruit.box_id
               AND DATE_PART('day', now() - fruit.expiry_date) <= farmer.waranty_days
SET boxes.expired = true
WHERE NOT boxes.expired AND fruit.id IS NULL