我有两个表table1和table2,结构如下。我需要使用表2中的值
更新表1中的列Table1:
ID , Txt1 , Txt2
ID是id,Txt 1和Txt 2是varchr
Table 2
TableId, Id_in_table1 , ValueType , Value
TableId是数据有效的表。所以在这种情况下tableId将包含Table1的表id。表的这些ID存储在另一个表中。我们基本上需要根据此tableId过滤数据,因为我们需要确保我们不会复制对此表无效的数据。
现在需要做的是,按照以下逻辑从table2更新表1的Txt1和Txt2,
表2中的TableId应与“表1”的tableID相匹配 对于table1的每个Id,它等于table2的“Id_in_table1”, 根据table2.ValueType将table1.value中的数据放入Txt1或Txt2中。 如果ValueType等于“Type1”,则更新table1.txt1 = table2.value 否则,如果ValueType等于“Type2”,则更新table2.txt2 = table2.value
可能还有其他的类型可能,但在这种情况下我们不需要做任何事情。
我写的SQL查询如下:
update
table1
set
table1.txt1 = (select value from table1 c join table2 f ON c.ID = f.Id_in_table1 and f.ValueType ='Type1')
我想在两个单独的查询中更新txt1和txt2。
但是这个查询会以相同的值更新table1中的所有行。我需要的逻辑是它应该只添加那些ID存在于table2中的行。
当select语句从连接中返回两行时,此查询也会失败,即如果table2中存在两个table1.Id。
任何人都可以帮我解决这个问题。
PS:我需要编写一个通用查询,而不是任何特定于数据库的查询。
TIA
答案 0 :(得分:1)
您是否考虑过UPDATE JOIN
:
UPDATE table1 t1
JOIN table2 t2
ON t2.id_in_table1 = t1.id
SET t1.txt1 = CASE WHEN t2.valuetype = 'Type1' THEN t2.value ELSE t1.txt1 END,
t1.txt2 = CASE WHEN t2.valuetype = 'Type2' THEN t2.value ELSE t1.txt2 END
如果您需要限制WHERE
,请添加JOIN
子句。
这是MySQL的正确语法,但您可能需要做一些肮脏的事情才能使用多种数据库语言。
答案 1 :(得分:1)
Type1
可以使用如下
update c
set c.txt1 = f.value
from table1 c
inner join table2 f
on c.ID = f.Id_in_table1
and f.ValueType ='Type1'
Type2
可以使用如下
update c
set c.txt2 = f.value
from table1 c
inner join table2 f
on c.ID = f.Id_in_table1
and f.ValueType ='Type2'