我有以下命令。
SELECT
supplier_name, EXTRACT(DOW FROM received) AS day_of_week, SUM(quantity) AS total_quantity
FROM
supplier NATURAL JOIN store
WHERE
item_id = (SELECT item_id FROM item WHERE item_name='Samsung Galaxy A50 A505F')
AND
received >= TIMESTAMP '2019-03-01 00:00:00 Europe/Prague'
AND
received < TIMESTAMP '2019-04-01 00:00:00 Europe/Prague'
AND
supplier_name='Amazon'
AND
day_of_week=3 -- this is the problem
GROUP BY
supplier_name, day_of_week;
使用此PostgreSQL模式。
item(item_id, item_name)
supplier(supplier_id, supplier_name)
store(id, item_id, supplier_id, price, vat, quantity, received)
将AND day_of_week=3
添加到WHERE
后,出现以下错误。
pgdb-> GROUP BY
pgdb-> supplier_name, day_of_week;
ERROR: column "day_of_week" does not exist
LINE 14: day_of_week=3
为什么不能限制此列?
答案 0 :(得分:1)
您不能在where
子句中使用派生列。一个简单的解决方案是横向连接:
SELECT . . ., v.day_of_week, . . .
FROM supplier su JOIN
store st
ON ??? CROSS JOIN LATERAL
(VALUES (EXTRACT(DOW FROM ?.received))) v(day_of_week)
WHERE . . . AND
v.day_of_week = 3
GROUP BY . . .
一些建议:
NATURAL JOIN
。它没有任何“自然”的东西,因为它不能识别正确声明的外键关系。而且非常容易出错。因为JOIN
条件没有明确说明,所以它使其他人(甚至通常是将来的自己)也看不懂代码。