查询的其余部分看不到WITH内部进行的修改?

时间:2018-07-11 21:53:52

标签: postgresql common-table-expression

我有一个层次结构:

CREATE TABLE thing (
  id serial NOT NULL,
  CONSTRAINT thing_pkey PRIMARY KEY (id)
)

CREATE TABLE thingthing (
  part integer NOT NULL,
  cont integer NOT NULL,
  CONSTRAINT thingthing_part_fkey FOREIGN KEY (part) REFERENCES thing (id),
  CONSTRAINT thingthing_cont_fkey FOREIGN KEY (cont) REFERENCES thing (id)
)

我编写了一个查询,该查询将某事物与另一事物断开连接,如果该事物不再与任何其他事物连接,也应将其删除。

WITH cte AS (
  DELETE FROM thingthing
  WHERE part = $1 AND cont = $2
)
DELETE FROM thing
WHERE id = $1 AND id NOT IN (SELECT part FROM thingthing)

问题在于第二个DELETE永远不会运行,而我最终在thing表中拥有未与他人连接的东西。

我的问题是,为什么第一个DELETE已从thingthing中删除了最后一条记录,而其中part具有$1作为值,为什么它没有运行。在这种情况下,我希望id NOT IN (SELECT part FROM thingthing)为真,但事实并非如此。

1 个答案:

答案 0 :(得分:1)

Quote from the manual

  

所有语句都使用相同的快照执行(请参见Chapter 13),因此它们无法“看到”彼此对目标表的影响。 [...]表示返回数据是在不同的WITH子语句和主查询之间传递更改的唯一途径。