独立于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是
- Product (code(产品代码), pname, descr, utype, uprice, manu, sid (SUPPLIER ID))
- 收据((PK)(bid, rdate, rtime), ptype, total)
- 购买((PK)(出价,日期,时间,代码),单位)
问题是“找到供应商数量最少的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'
如何引用使用 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是
- Product (code(产品代码), pname, descr, utype, uprice, manu, sid (SUPPLIER ID))
- 收据((PK)(bid, rdate, rtime), ptype, total)
- 购买((PK)(出价,日期,时间,代码),单位)
问题是“找到供应商数量最少的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'