2

我手头没有(昂贵的)SQL 标准。SQL 核心/基础中的可更新查询是什么?

我看到 PostgreSQL 不支持它们,但其他一些数据库支持;你能指点我关于它们如何在这些数据库中工作的文档吗?

PostgreSQL 具有规则 系统的查询重写和可更新视图;这是非常不同的吗?

4

1 回答 1

2

我刚刚在 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

链接:oracle参考文档示例

其他数据库支持吗?它记录在哪里?


现在把我肮脏的手套放在标准上,我就引用它。

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 不允许非表名的查询表达式可更新。正在对可更新视图进行一些工作。我不确定该功能在视图之外有多大用处,但该标准绝对很有趣,而且比预期的更奇怪。

【这里很寂寞。选择我的答案为最佳。]

于 2010-01-07T13:07:50.003 回答