【发布时间】:2011-01-02 11:22:52
【问题描述】:
我手头没有(昂贵的)SQL 标准;什么是 SQL 核心/基础中的可更新查询?
我看到 PostgreSQL 不支持它们,但其他一些数据库支持;你能告诉我关于它们如何在这些数据库中工作的文档吗?
【问题讨论】:
标签: sql standards-compliance semantics
我手头没有(昂贵的)SQL 标准;什么是 SQL 核心/基础中的可更新查询?
我看到 PostgreSQL 不支持它们,但其他一些数据库支持;你能告诉我关于它们如何在这些数据库中工作的文档吗?
【问题讨论】:
标签: sql standards-compliance semantics
我刚刚在 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
链接:预言机reference docs、examples。
其他数据库支持吗?它记录在哪里?
现在我已经把我肮脏的连指手套放在标准上,我将引用它。
E153 指的是:
第 7.12 条,“”:一个 是 可更新,即使它
包含一个
由于查询表达式也是一个表(不直观,但它在 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 不允许非表名的查询表达式可更新。正在对可更新视图进行一些工作。我不确定这个功能在视图之外有多大用处,但这个标准肯定很有趣,而且比预期的更奇怪。
[这里感觉很孤单。选择我的答案为最佳。]
【讨论】: