本文介绍了在不使用JOIN语句的情况下从一个表更新另一个表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想根据另一个表的值更新ON TABLE中的列,我使用的是稍微旧一点的Firebird 2.1版本,因此在UPDATE执行期间它不支持JOIN语句。为了消除这种情况,根据最初的Firebird常见问题解答http://www.firebirdfaq.org/faq323/中的说明下面的语句应该有效,但它遗漏了返回为NULL的列的某些值和值,如下面的数据集表格形式所示。

例如,Num 21 from Elements表的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))

元素

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

节点

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

推荐答案

按如下方式更新您的查询

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

这篇关于在不使用JOIN语句的情况下从一个表更新另一个表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-20 14:53