2016-07-26 145 views
0

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

我有当前设置farmer有许多box有很多fruits

每个农民在天保固期(int列),每种水果都有到期日(即依赖于交割期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

对这个问题的另一种思考方式是你想识别不包含新鲜水果的盒子。尝试是这样的:

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