DELETE FROM ... USING在引用表为空时不删除任​​何行

时间:2019-04-26 17:39:16

标签: postgresql

我想根据仅在表A中可用的输入(列name)从表B中删除行。这两个表在列id上相关。根据{{​​1}}的Postgres(9.6)文档以及此处的一些答案,看来DELETE子句很合适:

USING

实际上,这似乎可行(如果DELETE FROM A a USING B b WHERE $1 IS NULL OR (b.name = $1 AND a.id = b.id) $1,则删除NULL中的所有行;否则,只有A中共享{{1 }},其中Aid的{​​{1}}行。但是我最终在B为空的情况下运行了此命令,发现即使name适用,也没有从$1删除任何行。我什至将其简化为无B子句:

$1 IS NULL

,只要A为空,就不会从WHERE中删除任何内容。使用子选择的等效项符合我的预期:

DELETE FROM A
USING B

Postgres docs并没有严格排除这种差异,但是他们也没有说出任何可能性:

  

PostgreSQL通过在USING子句中指定其他表,可以在WHERE条件下引用其他表的列。 ...本质上,这是一个联接,所有成功联接的行都标记为删除。在某些情况下,连接样式比子选择样式更易于编写或执行。

也许我应该在其他地方阅读另一页?还是“成功连接的行”意味着必须存在一个连接?

0 个答案:

没有答案