基于ID更新表中的列并一次更新单个行

时间:2014-08-12 17:31:57

标签: mysql sql sql-server-2008 oracle11g

我有两个表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

2 个答案:

答案 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'