是`从连接中删除`标准SQL?

Tho*_*ten 7 mysql sql sql-server oracle

在其他问题中,这个问题询问了如何从连接中删除.

我的问题:这有多少是标准的SQL?这实际上在哪些数据库上工作(最值得注意的是Oracle,MySQL和SQLServer)?

DCo*_*kie 9

根据国际标准ISO/IEC 9075:1992第13.6节,第384-386页,不是标准.使用JOIN语法删除在Oracle中不起作用.

  • 实际上引用(巨大)标准的+1. (3认同)

Vin*_*rat 6

这实际上可以在Oracle中使用.FROM关键字是可选的:DELETE (query)DELETE FROM (query).相同.

删除JOIN的规则与更新JOIN的规则相同:Oracle仅在一个表中修改行,并且只有在识别基表的行时没有歧义.例如,查看此SO此SO.

让我们建立一个小例子:

CREATE TABLE t_parent (ID NUMBER PRIMARY KEY, NAME VARCHAR2(10));
CREATE TABLE t_child (ID NUMBER PRIMARY KEY, 
                      parent_id NUMBER REFERENCES t_parent);
INSERT INTO t_parent VALUES (1, 'a');
INSERT INTO t_child VALUES (1, 1);
INSERT INTO t_child VALUES (2, 1);
Run Code Online (Sandbox Code Playgroud)

您可以从CHILD表中删除行:

SQL> DELETE FROM (SELECT t_child.*
  2                 FROM t_child
  3                 JOIN t_parent ON t_parent.id = t_child.parent_id
  4                WHERE t_parent.name = 'a');

2 rows deleted
Run Code Online (Sandbox Code Playgroud)


Rem*_*anu 5

DELETE ... FROM ..不属于ANSI标准,也不属于UPDATE ... FROM...。这包括任何联接语法,因为联接只能用FROM来指定。

所有供应商都以一种或另一种形式实现此目的。