什么是SQL标准中的“带子查询的E153可更新查询”?

时间:2010-01-07 12:24:03

标签: sql standards-compliance semantics

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

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

PostgreSQL具有rule system的查询重写和可更新视图;这是非常不同的吗?

1 个答案:

答案 0 :(得分:0)

我刚刚在维基百科上发现这个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 reference docsexamples

其他数据库是否支持此功能?它在哪里记录?


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

E153指的是:

  

7.12,“<查询   表达式>“:A<查询表达式>是   即使它的< where也可以更新   条款>包含<子查询>

由于查询表达式也是一个表(不直观,但它在SQL99 4.16.3涉及表的操​​作中),这意味着查询表达式是一个“udpatable表”。根据4.16意味着我可以插入并删除它们。

这意味着我可以运行上述内容,以及:

DELETE FROM (SELECT * FROM t1 JOIN t2 WHERE t1c1 = t2c3);

还有一些规则来确定哪些查询表达式是可更新的,包含在sql99-foundation 7.11和7.12中;他们很参与。 PostgreSQL不允许不是表名的查询表达式可更新。在可更新视图上正在进行一些工作。我不确定这个功能在视图之外是多么有用,但是标准肯定很有趣,而且比预期的还要怪。

[这里感到孤独。尽可能地回答我的答案。]