Update one table from another w/o join statement (firebird)

北城以北 提交于 2020-01-11 12:54:08

问题


I'd like to update the columns in on table based on the values of another table, I use a slightly old version of Firebird 2.1 so it doesn't have support for the join statement during update execution. In order to eliminate that, based on the instructions given in original firebird faqs http://www.firebirdfaq.org/faq323/ following statment should work, but it misses some of the values and values for that columns a returned as null as shown in the below tabular form of dataset.

For example, Num 21 from Elements table should have 23 as value in its END_I column because it has exactly the same X_I, Y_I and Z_I values with node tables, but above statement returns 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

回答1:


Update your query as follow

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))

You should add first 1 because of firebird 2.1 doestn`t know that subquery return only one row.




回答2:


Instead of trying to use UPDATE, use MERGE:

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 allows you to use another table, view or query as source of the data to update or insert into a table.



来源:https://stackoverflow.com/questions/34559146/update-one-table-from-another-w-o-join-statement-firebird

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!