2016-07-26 3 views
0

Мне нужна помощь в обновлении некоторых полей в db в двух отношениях «один ко многим» между тремя таблицами.Обновление отношения «один ко многим»

У меня есть текущая установка farmer, которая имеет много box, которые имеют много fruits.

Каждый фермер имеет период Waranty в днях (ИНТ столбец), каждый плод имеет срок годности (что зависит от срока поставки 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 
Смежные вопросы