2011-05-30 69 views
1

我有兩個表,一個父表和一個子表。孩子將有許多行parent_id。這兩個表都有狀態欄。可能的值是「活動」和「已刪除」。Oracle更新查詢 - 兩個表的連接

我想這樣做。如果對於父母標識,所有孩子都有刪除狀態,則必須將父母也標記爲從活動狀態中刪除。它可以在單個更新查詢中完成嗎?

在此先感謝。

+0

記住,如果會議「A」已經插入,但沒有承諾一個新的「活動」記錄,會議「B」可能只看到「已刪除」記錄。您通常希望在高度併發的環境中避免這種做法。 – 2011-05-30 22:45:43

回答

2

這樣的事情呢?

UPDATE parent_table pt SET deleted = 'Y' WHERE deleted = 'N' AND id NOT IN 
    (SELECT parent_id FROM child_table ct WHERE deleted = 'N' AND ct.parent_id = pt.id) 
+0

比我的更聰明,避免每個記錄的子請求。 +1。 – Benoit 2011-05-30 12:00:09

+0

沒有任何child_table條目的parent_table條目也會被標記爲刪除 – schurik 2011-05-30 12:05:57

+0

@schurik:當沒有孩子時,可以從數學上說,所有的子行都被標記爲刪除,並且說這不是錯誤的。 – Benoit 2011-05-30 12:13:47

1

是:

update parent 
    set status = 'Deleted' 
where status = 'Active' 
    and not exists (select null from child 
        where child.id = parent.id 
         and child.status <> 'Deleted') 
1
UPDATE parent_table 
set status = 'deleted' 
WHERE status = 'active' 
    AND id in (
       SELECT parent_id 
       FROM (
        SELECT 
          parent_id 
          , count(*)           total 
          , sum (CASE staus WHEN 'deleted' THEN 1 ELSE 0 END) deleted 
        FROM child_table 
        group by parent_id 
      ) 
       WHERE total = deleted 
      )