代码之家  ›  专栏  ›  技术社区  ›  Jasper

SQL:在标准中,对联接进行更新?

sql
  •  1
  • Jasper  · 技术社区  · 16 年前

    我知道大多数SQL Server软件都允许您“对连接进行更新”,但我想知道,这是否在SQL标准中? (例如,我可以假设任何软件包都允许这样做吗?)

    注意:我之所以这么问是因为我正在编写一个数据库库,它应该可以很容易地扩展到原始构建中未包含的数据库软件。因此,回答诸如“A、B、C和B都允许这一点是毫无意义的——它们共同构成了市场的狮子座,所以你可以假设所有软件包都允许这样做”。不,我对它是否符合标准感兴趣。

    4 回复  |  直到 7 年前
        1
  •  2
  •   Stuart Ainsworth    16 年前

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

    我试图找到一个ANSI2003标准,但我最接近的是这里:www.wiscorp.com/sql_2003_standard.zip(一个最新的草案)。在update语句和join语法方面,两者之间没有实质性的区别。

    斯图

        2
  •  4
  •   IMSoP    7 年前

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

    此命令符合SQL标准,除了FROM和RETURN子句是PostgreSQL扩展,以及与WITHUPDATE一起使用的功能。

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

    虽然这并没有明确说明 不是吗? ,该手册中的兼容性说明通常在标准中存在相关但不相同的功能时进行说明。更重要的是,提到其他具有不同行为的系统表明,如果有一个标准,那么无论如何都不能依赖它。

        3
  •  2
  •   Aaron Alton    16 年前

    您假设所有软件包都遵循ANSI SQL标准……实际上,我所知道的所有软件包都没有完全遵循这些标准。

    如果您希望遵守ANSI SQL标准,最好从文档化的标准本身开始。以下是SQL-92文档:

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

        4
  •  2
  •   Jeff Moden    12 年前

    小心点,伙计们。编写真正的可移植代码比您想象的要困难得多,而且您还必须愿意在性能、易于编码/维护和可读性方面放弃很多东西。只需声明并使用SQL Server中的一个变量,您的代码就不再是真正可移植的了。编写一个审计触发器,我可以保证您的触发器不会在Oracle、SQL Server和其他几个流行的引擎之间移植。而且,这真的很重要,因为它在任何RDBMS中都不是火箭科学(好吧,除了在Oracle中编写联合更新而不使用标准但不可移植的merge)。

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

    为“真正的”可移植性编写代码时要小心。你最终可能会陷入混乱,比你想象的要慢得多。