2014-01-17 44 views
1

我試圖用另一個表中的數據更新表。 數據是在試圖保持由簡單SQL錯誤:ORA-01779:無法修改映射到非密鑰保存表的列

PROJECT(表)

ID FK_INCIDENT-ID DAYS 
--------------------------- 
01 10    0 
02 20    0 

事故(表)

ID FK_PRIORITY-ID 
------------------ 
10 100 
20 200 

優先(表)

ID DAYS 
--------- 
100 1 
200 2 

我需要做的是將項目中的DAYS從PRIORITY複製到DAYS,並將INCIDENT綁定在一起。

更新項目表後,它看起來應該像這樣

ID FK_INCIDENT-ID DAYS 
--------------------------- 
01 10    1 
02 20    2 

唯一的領帶項目有優先通過事件。

FK_INCIDENT-ID(在項目)FK_PRIORITY-ID(入射光)以ID(優先級)

update (select i.ID, pro.Days, pri.Days AS Days2 
from incident i 
left join project pro on (i.id = pro.FK_Incident-id) 
left join priority pri on (i.Fk_priority-id = pri.id) 
where pro.days = 0) t 
set t.Days = t.Days2 

感謝您的幫助,您可以提供。

回答

0

你似乎在錯誤的順序爲你所描述的關係能夠加入你的表;你說:

FK_INCIDENT-ID (in PROJECT) to FK_PRIORITY-ID (in INCIDENT) to ID (in PRIORITY)

,但你要加入INCIDENTPROJECTPRIORITY

這就是爲什麼你會收到錯誤。你的模式中沒有任何東西可以阻止事件映射到多個項目,而左外部聯接意味着同一事件可以多次出現,即使它不出現,如果它只出現一次,那麼你不一定知道如何回到正確的記錄進行更新。

如果重新排序在線視圖查詢加入PROJECTINCIDENTPRIORITY那麼它的工作原理(與有效的名稱):

update (
    select i.ID, pro.Days, pri.Days AS Days2 
    from project pro 
    left join incident i on (i.id = pro.incident_id) 
    left join priority pri on (pri.id = i.priority_id) 
    where pro.days = 0) t 
set t.Days = t.Days2; 

SQL Fiddle

爲什麼days值去歸一化進project桌子呢?或者它是否意味着其他的東西(比如實際的解決時間,而不是優先考慮的目標),並且對於沒有設置它的項目,你只是假設最差?雖然這似乎更適合於incident的水平,但我會想。或者這可以全部組成,當然...

相關問題