2016-07-26 249 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