使用带有where子句的“选择查询”更新表

时间:2010-09-23 15:11:57

标签: sql sql-server select join sql-update

我想实现以下目标:

表格的当前状态(my_table)

 id        totalX          totalY          totalZ               
 --------- --------------  --------------  --------------       
         9             34              334             0      
        10              6               56             0      
        11             21              251             0      
        12              3               93             0   

查询(my_table2)

的结果
select id,count(*) as total FROM my_table2 WHERE column_2 = 1 GROUP BY id

 id        total               
 --------- --------------       
         9            500      
        10            600      
        11            700      
        12            800  

表格的预期状态(my_table)

 id        totalX          totalY          totalZ               
 --------- --------------  --------------  --------------       
         9             34              334             500      
        10              6               56             600      
        11             21              251             700      
        12              3               93             800    

这可以在一个更新查询中完成吗?我在RHEL 5.0上寻找Sybase ASE 12.5

编辑:我找不到Sybase的解决方案,但目前这个问题的答案适用于MS SQL Server ..

4 个答案:

答案 0 :(得分:10)

   update 
          my_table 
   set 
      my_table.totalZ = t.total 
   FROM
    my_table mt
    INNER JOIN 
       (select id,count(*) as total 
       FROM my_table2 
      WHERE column_2 = 1 GROUP BY id) t
   on mt.id  = t.id

更新在MS SQL Server中,您将这样做。 OP指出这在Sybase中不起作用。

答案 1 :(得分:2)

这样的事情应该可以解决问题

update my_table
set my_table.totalZ = (select count(*) from my_table2 where my_table.id = my_table2.id and my_table2.column_2 = 1);

答案 2 :(得分:0)

答案 3 :(得分:0)

最好和更可靠的方法是使用MERGE。

MERGE INTO my_table
USING (select id,count(*) as total FROM my_table2 WHERE column_2 = 1 GROUP BY id) t2
ON (my_table.id=t2.id)
WHEN MATCHED THEN
UPDATE SET totalZ = t2.total

参考:http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc36272.1572/html/commands/commands89.htm