独立于sql的as语句postgresql

gstyhher  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(323)

如何引用创建的不同表 WITH ... AS 声明?
这是我的密码

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是空的
产品(代码(产品代码)、pname、descr、utype、uprice、manu、sid(供应商id))
收据((pk)(bid,rdate,rtime),ptype,total)
采购((pk)(投标、日期、时间、代码)、单位)
而问题是“找到供应商数量最少的收据,总共有50多家,里面没有买 cucumber (我提供此信息是为了防止询问x y问题)
如您所见,我正在尝试构建它,以便创建的每个新表都依赖于prevision表。但是当我这样做的时候,我得到了一个错误,我不能引用prevision表(可能因为它被算作同一个查询)
在语句之间尝试分号也不起作用。

b1zrtrql

b1zrtrql1#

本部分:

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'
3bygqnnd

3bygqnnd2#

首先,不要重复 with . 第二,像引用任何表或视图一样引用它们:

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标准即可。
限定列引用,特别是当您有多个表引用时。
我把cte的名字从“table”改成了“cte”。我认为“表”是误导。

相关问题