独立于as语句postgresql

Independent with as statement postgresql

如何引用使用 WITH ... AS 语句创建的不同 table?

这是我的代码

WITH TABLE1 AS
(
    SELECT code 
    FROM Product 
    WHERE pname <> "cucumber"
),
TABLE2 AS
(
    SELECT bid, rdate, rtime, code 
    FROM Purchase
    WHERE code IN TABLE1
),
TABLE3 AS
(
    SELECT COUNT(*) AS AMOUNT, bid, rdate, rtime 
    FROM TABLE2
    NATURAL JOIN Receipt
    WHERE total > 50
    GROUP BY bid, rdate, rtime;
),
TABLE4 AS
(
    SELECT * 
    FROM TABLE3
    WHERE AMOUNT = ALL(SELECT MIN(AMOUNT)
                       FROM TABLE3)
)
SELECT * 
FROM Receipt 
WHERE bid, rdate, rtime  = ALL(SELECT bid, rdate, rtime 
                               FROM TABLE4);

table是

问题是“找到供应商数量最少的Receipt,总数超过50个,并且没有购买过黄瓜。 (我提供此信息是为了防止询问 X Y 问题)

如您所见,我正在尝试构建它,以便创建的每个新 table 都依赖于预置版本。但是当我这样做时,我得到一个错误,我无法引用预定义 tables(可能因为它被算作同一个查询)

尝试在语句之间使用分号也不起作用。

首先,不重复with。其次,像引用任何 table 或查看:

一样引用它们
WITH cte1 AS (
      SELECT code
      FROM Product
      WHERE pname <> 'cucumber'
     ),
     cte2 AS (
      SELECT bid, rdate, rtime, code
      FROM Purchase
      WHERE code IN (SELECT cte1.code FROM cte1)
     ),
     . . .

其他说明:

  • 对字符串使用单引号。虽然有些数据库支持双引号,但是用SQL标准就行了。
  • 限定列引用,尤其是当您有多个 table 引用时。
  • 我将 CTE 的名称从“table”更改为“CTE”。我认为“table”具有误导性。

这部分:

SELECT * 
FROM Receipt 
WHERE bid, rdate, rtime  = ALL (SELECT bid, rdate, rtime 
                                FROM TABLE4);

是问题所在。这与您的 CTE 无关。

如果要比较多列,则必须将它们括在左侧的括号中:

SELECT * 
FROM Receipt 
WHERE (bid, rdate, rtime) = ALL(SELECT bid, rdate, rtime 
                                FROM TABLE4);

另外:"cucumber" 引用了一个名为 cucumber。 SQL:

中字符串常量需要用单引号括起来
pname <> 'cucumber'