【发布时间】:2011-08-18 19:52:16
【问题描述】:
我在使用 Oracle 10g 语法进行相关 UPDATE 时遇到困难。我正在 PL/SQL 过程中处理此代码。
我会这样处理 SQL Server 中的问题:
UPDATE table_a a
SET a.prov_id=pn.prov_id,
a.step=1
from (
SELECT p.prov_id
FROM note n
INNER JOIN provider p ON n.author_id=p.user_id
where n.enc_id=a.enc_id
AND TRUNC(n.note_time)=a.attr_date
) pn
等价的Oracle语法是:
UPDATE table_a a
SET a.prov_id=(
SELECT p.prov_id
FROM note n
INNER JOIN provider p ON n.author_id=p.user_id
where n.enc_id=a.enc_id
AND TRUNC(n.note_time)=a.attr_date
),
a.step=1
WHERE EXISTS (
SELECT *
FROM note n
INNER JOIN provider p ON n.author_id=p.user_id
where n.enc_id=a.enc_id
AND TRUNC(n.note_time)=a.attr_date
)
这实际上会运行子查询两次吗?还有比这更缩写的语法吗?
【问题讨论】:
-
看一下 SQL 关键字
MERGE:SQL Server 和 Oracle 都支持它,都基于标准 SQL,因此在这些 SQL 产品之间具有高度可移植性。
标签: sql sql-server plsql oracle10g correlated-subquery