小编典典

从另一个不带join语句的表中更新一个表(firebird)

sql

我想根据另一个表的值更新表中的列,我使用的是Firebird
2.1稍旧的版本,因此它在更新执行期间不支持join语句。为了消除这种情况,根据原始firebird常见问题解答http://www.firebirdfaq.org/faq323/中给出的说明,
应遵循以下声明,但它会丢失该列的某些值和值,并返回null,如图所示以下面的数据集表格形式显示。

例如,Elements表中的Num 21在其END_I列中的值应为23,因为它与节点表具有完全相同的X_I,Y_I和Z_I值,但是上面的语句返回null。

update elements E set E.END_I = (select n.node_num from nodes N 
where (N.XI =E.X_I and N.YI = E.Y_I and N.ZI=E.Z_I) )
where exists (select 1 from nodes N where (N.XI =E.X_I and N.YI = E.Y_I and N.ZI=E.Z_I))

ELEMENTS

Num   End_I      End_J       X_I         Y_I        Z_I 
17  18.000000   19.000000   0.000000    1.500000    18.000000   0.000000    1.500000    21.000000
18  19.000000   20.000000   0.000000    1.500000    21.000000   0.000000    1.500000    24.000000
19  20.000000   21.000000   0.000000    1.500000    24.000000   0.000000    1.500000    27.000000
20  21.000000   22.000000   0.000000    1.500000    27.000000   0.000000    1.500000    30.000000
21  [null]      24.000000   2.400000    0.000000    0.000000    2.400000    0.000000    3.000000
22  [null]      25.000000   2.400000    0.000000    3.000000    2.400000    0.000000    6.000000
23  [null]      26.000000   2.400000    0.000000    6.000000    2.400000    0.000000    9.000000


NODES 
Node_Num XI     YI          ZI
20  0.000000    1.500000    24.000000
21  0.000000    1.500000    27.000000
22  0.000000    1.500000    30.000000
23  2.400000    0.000000    0.000000
24  2.400000    0.000000    3.000000
25  2.400000    0.000000    6.000000

阅读 179

收藏
2021-04-15

共1个答案

小编典典

如下更新查询

update elements E set E.END_I = (select first 1 n.node_num from nodes N 
where (N.XI =E.X_I and N.YI = E.Y_I and N.ZI=E.Z_I) )
where exists (select 1 from nodes N where (N.XI =E.X_I and N.YI = E.Y_I and N.ZI=E.Z_I))

您应该添加,first 1因为firebird 2.1并不知道子查询仅返回一行。

2021-04-15