【发布时间】:2014-05-11 15:00:00
【问题描述】:
在 Oracle SQL 中,您可以轻松地根据相关子查询中的 NOT EXISTS 条件进行更新。这对于基于另一个查询或 id 列表进行更新很有用。
Postgres 中子查询的机制不同……我怎样才能达到相同的目标? http://sqlfiddle.com/#!1/1dbb8/55
您将如何在 Oracle 上做到这一点
UPDATE UserInfo a
SET a.username = 'not found'
WHERE NOT EXISTS (SELECT 'X'
FROM UserOrder b
WHERE b.userid = a.userid)
AND a.userid in (1,2,3);
Postgres NOT EXISTS 查询:可行
SELECT u.userid, u.username
FROM UserInfo AS u
WHERE NOT EXISTS
( SELECT *
FROM UserOrder AS o
WHERE o.userid = u.userid
);
Postgres NOT EXISTS 更新:不起作用
UPDATE UserInfo
SET username = 'not found'
FROM (SELECT u.userid
FROM UserInfo AS u
WHERE NOT EXISTS
( SELECT *
FROM UserOrder AS o
WHERE o.userid = u.userid
)) em
WHERE em.userid = UserInfo.userid;
【问题讨论】:
-
所以你想更新一个左反连接的左边?在 Pg 中,您可以执行此操作,但不幸的是,它需要在左侧进行自连接,例如
update t1 ... from t1 a left outer join ... on ... where t.id = t1.id,因为除了针对更新目标表的inner join(impicit,通过update ... from)之外,没有任何支持。 -
给定的解决方案有效。考虑一下updated fiddle。
标签: sql oracle postgresql