在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
)
问题是我遇到了困难,并且不知道如何排除没有过期所有果实的盒子。 我还试图添加一个计数,然后离开加入结果,但它仍然无法正常工作。
欢迎任何建议。
答案 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