SQL:标准中的连接更新?

时间:2009-10-04 22:35:43

标签: sql

我知道大多数sql server软件允许你做“关于加入的更新”,但我想知道,这是在SQL标准中吗? (例如,我可以假设任何软件包允许这样做吗?)

注意:我问这个是因为我正在编写一个数据库库,应该可以轻松扩展到原始版本中未包含的数据库软件。因此,没有必要回答诸如“a,b,c和b都允许这样的说法 - 它们共同组成了市场的狮子会,所以你可以假设所有的软件包都允许这样做”。不,我对它是否符合标准感兴趣。

4 个答案:

答案 0 :(得分:4)

如果我理解正确的问题,我认为答案是否定的,没有标准的“基于连接的更新”。 postgres manual page for UPDATE在“兼容性”下包含此内容:

  

此命令符合SQL标准,但FROM和RETURNING子句是PostgreSQL扩展,以及使用WITH with UPDATE的能力。

     

其他一些数据库系统提供FROM选项,其中目标表应该在FROM中再次列出。这不是PostgreSQL解释FROM的方式。移植使用此扩展程序的应用程序时要小心。

虽然这并没有明确说明不是,但该手册中的兼容性说明通常会注意标准中有相关但不相同的功能。更重要的是,提及具有不同行为的其他系统表明,如果有标准,无论如何都不能依赖它。

答案 1 :(得分:2)

您假设所有软件包都遵循ANSI SQL标准.....实际上,我所知道的并不完全符合标准。

如果您希望遵守ANSI SQL标准,那么最好的起点就是文档标准本身。这是SQL-92文档:

http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

答案 2 :(得分:2)

根据ANSI SQL-92标准,JOINed表的UPDATE不是标准的一部分;请参阅http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt第13.9和13.10节(您必须搜索391,页码)。

我试图找到一个ANSI 2003标准,但我最接近的是:www.wiscorp.com/sql_2003_standard.zip(一个迟到的草案)。两者在UPDATE语句和JOIN语法方面没有实质性区别。

斯图

答案 3 :(得分:2)

现在小心,伙计们。编写真正可移植的代码比您想象的要困难得多,您还必须愿意在性能,编码/维护的简易性和可读性方面放弃很多。只需在SQL Server中声明并使用一个变量,您的代码就不再是真正可移植的。写一个审计触发器,我可以保证你的触发器不能在Oracle,SQL Server和其他几个流行的引擎之间移植。并且,它应该真正重要,因为它实际上并不是任何RDBMS中的火箭科学(好吧,除非在不使用MERGE {但这是标准但不可移植的情况下}在Oracle中编写连接的UPDATE}。

另外,不要忘记有两种基本类型的SQL。这支持大多数前端代码和批处理代码的单行性质。如果你真的希望你的批处理代码运行良好,那么你将使用许多“专有扩展”来处理数据库引擎,以便在一夜之间有效地处理数十亿行。 ; - )

在针对“真正”可移植性编写代码时要小心。你最终可能会陷入一种比你想象的慢得多的混乱局面。