我想根据仅在表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 }},其中A
是id
的{{1}}行。但是我最终在B
为空的情况下运行了此命令,发现即使name
适用,也没有从$1
删除任何行。我什至将其简化为无B
子句:
$1 IS NULL
,只要A
为空,就不会从WHERE
中删除任何内容。使用子选择的等效项符合我的预期:
DELETE FROM A
USING B
Postgres docs并没有严格排除这种差异,但是他们也没有说出任何可能性:
PostgreSQL通过在USING子句中指定其他表,可以在WHERE条件下引用其他表的列。 ...本质上,这是一个联接,所有成功联接的行都标记为删除。在某些情况下,连接样式比子选择样式更易于编写或执行。
也许我应该在其他地方阅读另一页?还是“成功连接的行”意味着必须存在一个连接?