2009-09-08 62 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