我手头没有(昂贵的)SQL 标准。SQL 核心/基础中的可更新查询是什么?
我看到 PostgreSQL 不支持它们,但其他一些数据库支持;你能指点我关于它们如何在这些数据库中工作的文档吗?
我手头没有(昂贵的)SQL 标准。SQL 核心/基础中的可更新查询是什么?
我看到 PostgreSQL 不支持它们,但其他一些数据库支持;你能指点我关于它们如何在这些数据库中工作的文档吗?
我刚刚在 Wikipedia 上找到了这个 Oracle 示例,它看起来像更新左侧的 SELECT:
UPDATE (
SELECT *
FROM articles
JOIN classification c
ON a.articleID = c.articleID
) AS a
SET a.[updated_column] = updatevalue
WHERE c.classID = 1
而大多数数据库需要将查询编写为:
UPDATE a
SET a.[updated_column] = updatevalue
FROM articles a
JOIN classification c
ON a.articleID = c.articleID
WHERE c.classID = 1
其他数据库支持吗?它记录在哪里?
现在把我肮脏的手套放在标准上,我就引用它。
E153 指:
子条款 7.12,“<query expression>”:一个 <query expression> 是可更新的,即使它的 <where 子句> 包含一个 <subquery>
由于查询表达式也是一个表(不直观,但在 SQL99 4.16.3 涉及表的操作中),这意味着查询表达式是一个“udpatable table”。根据 4.16 意味着我可以插入和删除它们。
这意味着我可以运行上述内容,以及:
DELETE FROM (SELECT * FROM t1 JOIN t2 WHERE t1c1 = t2c3);
还有一些规则可以确定哪些查询表达式是可更新的,包含在 sql99-foundation 7.11 和 7.12 中;他们相当参与。PostgreSQL 不允许非表名的查询表达式可更新。正在对可更新视图进行一些工作。我不确定该功能在视图之外有多大用处,但该标准绝对很有趣,而且比预期的更奇怪。
【这里很寂寞。选择我的答案为最佳。]