我想根据另一个表的值更新表中的列,我使用稍微旧版本的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
答案 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知道子查询只返回一行。