2009-09-08 104 views
0
Table 1: 
Name, x1-X2, fk1, fk2. 
Table 2: 
K1(parent for table 1),X 

如何更新表1,其在FK-第二列X1-X2 depands,FK2從表2使用外鍵值的Oracle Sql更新?

Table1: 
a,1.0,1,2 
b,-3.0,2,3 

Table 2 
1,4.0 
2,5.0 
3,2.0 
+0

既然你在表2中有X1和X2,爲什麼你需要fk1和fk2。你不能只用一個嗎? – 2009-09-08 10:45:27

+0

,因爲表1有2行與表2映射 – 2009-09-08 10:46:53

+0

那麼,哪些行x1和x2 corespond? – 2009-09-08 10:48:07

回答

2

在此設置:

CREATE TABLE table2 (k NUMBER PRIMARY KEY, x NUMBER); 
CREATE TABLE table1 (
    NAME VARCHAR2(10) PRIMARY KEY, 
    diff NUMBER, 
    fk1 NUMBER REFERENCES table2, 
    fk2 NUMBER REFERENCES table2); 

以下更新將「刷新」科拉姆table1.difftable2值:

SQL> UPDATE (SELECT child.diff old_diff, parent2.x - parent1.x new_diff 
    2   FROM table1 child 
    3   JOIN table2 parent1 ON (child.fk1 = parent1.k) 
    4   JOIN table2 parent2 ON (child.fk2 = parent2.k)) 
    5  SET old_diff = new_diff 
    6 WHERE old_diff != new_diff 
    7  OR (old_diff IS NULL AND new_diff IS NOT NULL) 
    8  OR (old_diff IS NOT NULL AND new_diff IS NULL); 

只需要更新將被刷新(感謝where子句)的行。

+0

你真的可以更新嗎?這樣的表達?我期望看到UPDATE table1 SET diff =(SELECT ...)WHERE(...);而SELECT將與你所擁有的相似 - 只用new_diff - 而最後一個三重點將是一個與你所擁有的相似的條件。 – 2009-09-08 12:14:05

+0

是Jonathan,因爲我們只更新子表並且連接保留鍵保存(對於每個連接,來自table1的一行指向使用該連接的最多一行table2)。自至少8i以來,更新保留鍵的子查詢是可用的。 – 2009-09-08 13:14:50

0

不太知道我理解的問題,參照完整性約束並不妨礙你更新表。如果您需要在交易中進行大量工作,您可以查看延期約束。有沒有可能澄清你的意思?

+0

更新了qn.is,現在好嗎? – 2009-09-08 10:54:27

0

不確定問題到底是什麼,也許你需要重新解釋一下這個問題。

通常,外鍵約束確保在被引用表中存在相應的行。

當您使用外鍵更新行,並嘗試設置一個不指向此主行的值時,您會立即或在提交時(取決於何時執行該約束) ,它可以推遲)。

除此之外,更新與其他更新沒有區別。

+0

更新了qn.is,現在好嗎? – 2009-09-08 10:54:57

0

由於表1中的數據取決於表2中的數據,因此您將無法直接「更新」表1。

您必須對錶2進行更新,然後重新計算表1

你可以做一個交易或者是桌子上的觸發器內2

另一種選擇可能是有表一個只保存外鍵和名稱,然後創建一個計算X1-X2值的視圖。

編輯

看樣本數據後,我不認爲你可以明確地有表2可以更新,因爲在表1

更新例如,如果你更新的結果表1的第二列是43,你怎麼會知道什麼值來設置表2的特定行(也可能是40和3,20和23等)

+0

由於我正在處理已經創建的表格。我正在尋找更新第一個表的查詢...一旦表table2中有更新,我將從我的應用程序中觸發該查詢。 – 2009-09-08 10:58:05

+0

由於表1是(x1-x2),您現在將知道X的值是什麼表2中的特定行。如果你有x1和x2列,你可以這樣做,但我不確定你可以。除非我錯過了一些東西。 – 2009-09-08 11:01:23

+0

對不起,應該說「你不會知道」 – 2009-09-08 11:01:58