【发布时间】:2020-05-22 13:30:40
【问题描述】:
我有 2 个重复且很长的子查询,因此我想给它一个名称,然后在查询中引用该名称,如 https://stackoverflow.com/a/3058938/6700081 中所述。
我有一个带有 ID、Name、OrderID 的客户表
我有带有 ID 的 Orders 表(这是订单 ID,所以它也是外键)、Price、Order_Date
这是我的原始查询,运行良好:
SELECT CUSTOMERS.name, ORDERS.price FROM
CUSTOMERS INNER JOIN ORDERS
ON (CUSTOMERS.ORDER_ID = ORDERS.ID)
WHERE ORDERS.PRICE = (SELECT MAX(ORDERS.PRICE) from ORDERS where ORDERS.ORDER_DATE <= (SELECT ADD_MONTHS((SELECT MIN(ORDER_DATE) FROM ORDERS), 12*10) from ORDERS WHERE ROWNUM = 1))
AND ORDERS.ORDER_DATE <= (SELECT ADD_MONTHS((SELECT MIN(ORDER_DATE) FROM ORDERS), 12*10) from ORDERS WHERE ROWNUM = 1);
我尝试将其更改为命名查询,如下所示:
WITH MAX_ORDER_DATE as (SELECT ADD_MONTHS((SELECT MIN(ORDER_DATE) FROM ORDERS), 12*10) from ORDERS WHERE ROWNUM = 1),
WITH MAX_ORDER_PRICE as (SELECT MAX(ORDERS.PRICE) from ORDERS where ORDERS.ORDER_DATE <= (MAX_ORDER_DATE))
SELECT CUSTOMERS.name, ORDERS.price FROM
CUSTOMERS INNER JOIN ORDERS
ON (CUSTOMERS.ORDER_ID = ORDERS.ID)
WHERE ORDERS.PRICE = (MAX_ORDER_PRICE)
AND ORDERS.ORDER_DATE <= (MAX_ORDER_DATE);
但我收到与无效表名相关的错误。这个查询有什么问题?
【问题讨论】:
-
删除第二个
WITH,它应该可以工作。WITH只能在 CTE 定义的开头指定一次。 -
我仍然收到错误,指出 MAX_ORDER_DATE 是无效标识符
-
是的,您还有其他问题,我在下面发布了更正。
标签: oracle