UPDATE t1 SET t1.BuilderName='ZhangSan'
from
(
SELECT * from tCardList_Made
WHERE BuilderName='123'
) AS t1
SQL
update
select
语句
最常用的
update
语法是:
UPDATE
TABLE_NAME
SET
column_name1 = VALUE WHRER column_name2 = VALUE
如果我的更新值Value是从一条
select
语句拿出来,而且有很多列的话,用这种语法就很麻烦
第一,要
select
出来放在临时变量上,有很多个很难保存。
第二,再将变量进行赋值。
列多起来非常麻烦,能不能像
Insert
那样,把整个
Select
语句的结果进行插入呢?
就好象下面::
INSERT
INTO
table1
(c1, c2, c3)
(
SELECT
v1, v2, v3
FROM
table2)
答案是可以的,具体的语法如下:
UPDATE
table1 alias
SET
(column_name,column_name ) = (
SELECT
(column_name, column_name)
FROM
table2
WHERE
column_name = alias.column_name)
WHERE
column_name = VALUE
下面是这样一个例子:
两个表a、b,想使b中的memo字段值等于a表中对应id的
name
值
表a:
id
name
1 王
2 李
3 张
表b:
id ClientName
1
2
3
(MS SQL Server)语句:
UPDATE
b
SET
ClientName = a.
name
FROM
a,b
WHERE
a.id = b.id
(Oralce)语句:
UPDATE
b
SET
(ClientName) = (
SELECT
name
FROM
a
WHERE
b.id = a.id)
update
set
from
语句格式
当
where
和
set
都需要关联一个表进行查询时,整个
update
执行时,就需要对被关联的表进行两次扫描,显然效率比较低。
对于这种情况,Sybase和SQL SERVER的解决办法是使用
UPDATE
…
SET
…
FROM
…
WHERE
…的语法,实际上就是从源表获取更新数据。
在 SQL 中,表连接(
left
join
、
right
join
、
inner
join
等)常常用于
select
语句。
其实在 SQL 语法中,这些连接也是可以用于
update
和
delete
语句的,在这些语句中使用
join
还常常得到事半功倍的效果。
UPDATE
T_OrderForm
SET
T_OrderForm.SellerID =B.L_TUserID
FROM
T_OrderForm A
LEFT
JOIN
T_ProductInfo B
ON
B.L_ID=A.ProductID
用来同步两个表的数据!
Oralce和DB2都支持的语法:
UPDATE
A
SET
(A1, A2, A3) = (
SELECT
B1, B2, B3
FROM
B
WHERE
A.ID = B.ID)
MS SQL Server不支持这样的语法,相对应的写法为:
UPDATE
A
SET
A1 = B1, A2 = B2, A3 = B3
FROM
A
LEFT
JOIN
B
ON
A.ID = B.ID
个人感觉MS SQL Server的
Update
语法功能更为强大。MS SQL SERVER的写法:
UPDATE
A
SET
A1 = B1, A2 = B2, A3 = B3
FROM
A, B
WHERE
A.ID = B.ID
在Oracle和DB2中的写法就比较麻烦了,如下:
UPDATE
A
SET
(A1, A2, A3) = (
SELECT
B1, B2, B3
FROM
B
WHERE
A.ID = B.ID)
WHERE
ID
IN
(
SELECT
B.ID
FROM
B
WHERE
A.ID = B.ID)