从另一个w / o join语句(firebird)更新一个表

时间:2016-01-01 19:09:05

标签: sql firebird

我想根据另一个表的值更新表中的列,我使用稍微旧版本的Firebird 2.1,因此在更新执行期间它不支持join语句。为了消除这种情况,根据原始火鸟常见问题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

2 个答案:

答案 0 :(得分:2)

使用MERGE

,而不是尝试使用UPDATE
merge into elements E
  using node N
  on N.XI = E.X_I and N.YI = E.Y_I and N.ZI = E.Z_I
  when matched then
    update set E.END_I = N.node_num

Merge允许您使用另一个表,视图或查询作为要更新或插入表格的数据源。

答案 1 :(得分:0)

按以下步骤更新您的查询

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 doestn知道子查询只返回一行。