我怎样才能做一个SQL语句与JOIN UPDATE语句?

我需要使用“父”表中的数据更新SQL Server 2005中的这个表,如下所示:

拍卖

id (int) udid (int) assid (int) 

UD

 id (int) assid (int) 

sale.assid包含更新ud.assid的正确值。 什么查询会做到这一点? 我正在考虑join,但我不确定是否有可能。

语法严格取决于您正在使用的SQL DBMS。 这里有一些在ANSI / ISO(也可以在任何SQL DBMS上工作),MySQL,SQL Server和Oracle的方法。 请注意,我build议的ANSI / ISO方法通常比其他两种方法慢得多,但是如果您使用MySQL,SQL Server或Oracle之外的SQL DBMS,则可能是唯一的方法如果你的SQL DBMS不支持MERGE ):

ANSI / ISO:

 update ud set assid = ( select sale.assid from sale where sale.udid = ud.id ) where exists ( select * from sale where sale.udid = ud.id ); 

MySQL的:

 update ud u inner join sale s on u.id = s.udid set u.assid = s.assid 

SQL Server:

 update u set u.assid = s.assid from ud u inner join sale s on u.id = s.udid 

甲骨文:

 update (select u.assid as new_assid, s.assid as old_assid from ud u inner join sale s on u.id = s.udid) up set up.new_assid = up.old_assid 

这应该在SQL Server中工作:

 update ud set assid = sale.assid from sale where sale.udid = id 

Postgres的

 UPDATE table1 SET COLUMN = value FROM table2, table3 WHERE table1.column_id = table2.id AND table1.column_id = table3.id AND table1.COLUMN = value AND table2.COLUMN = value AND table3.COLUMN = value 

一个标准的SQL方法将是

 UPDATE ud SET assid = (SELECT assid FROM sale s WHERE ud.id=s.id) 

在SQL Server上,您可以使用连接

 UPDATE ud SET assid = s.assid FROM ud u JOIN sale s ON u.id=s.id 

PostgreSQL :

 CREATE TABLE ud (id integer, assid integer); CREATE TABLE sales (id integer, udid integer, assid integer); UPDATE ud SET assid = sales.assid FROM sales WHERE sales.id = ud.id; 

使用JOIN -ing多个表简化更新查询。

  UPDATE first_table ft JOIN second_table st ON st.some_id = ft.some_id JOIN third_table tt ON tt.some_id = st.some_id ..... SET ft.some_column = some_value WHERE ft.some_column = 123456 AND st.some_column = 123456 

– first_table,second_table,third_table和some_column(如123456)是演示表名,列名和ID。 用有效名称replace它们。

SQL的另一个例子是不是真正的便携式。

对于MySQL,它将是:

 update ud, sale set ud.assid = sale.assid where sale.udid = ud.id; 

欲了解更多信息阅读多表更新: http : //dev.mysql.com/doc/refman/5.0/en/update.html

 UPDATE [LOW_PRIORITY] [IGNORE] table_references SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition] 

Teradata Aster提供了另一个有趣的方式来实现这个目标:

 MERGE INTO ud --what trable should be updated USING sale -- from what table/relation update info should be taken ON ud.id = sale.udid --join condition WHEN MATCHED THEN UPDATE SET ud.assid = sale.assid; -- how to update 

我以为在顶端的post中的SQL服务器将为Sybase工作,因为他们都是T-SQL,但不幸的是不是。

对于Sybase,我发现更新需要在表本身而不是别名:

 update ud set u.assid = s.assid from ud u inner join sale s on u.id = s.udid 

使用FROM关键字的以下语句用于使用连接更新多行

 UPDATE users set users.DivisionId=divisions.DivisionId from divisions join users on divisions.Name=users.Division 
 UPDATE tblAppraisalBasicData SET tblAppraisalBasicData.ISCbo=1 FROM tblAppraisalBasicData SI INNER JOIN aaa_test RAN ON SI.EmpID = RAN.ID 

在MS ACCESS中:

 UPDATE ud INNER JOIN sale ON ud.id = sale.udid SET ud.assid = sale.assid;