为Oracle中的子查询指定名称

为Oracle中的子查询指定名称,oracle,Oracle,我有两个子查询,它们是重复的,非常长,所以我想给它一个名称,然后在查询中引用该名称,如中所述 我有一个带有ID、Name、OrderID的Customers表 我有ID为的Orders表这是订单ID,所以它也是外键、价格、订单日期 这是我的原始查询,运行良好: SELECT CUSTOMERS.name, ORDERS.price FROM CUSTOMERS INNER JOIN ORDERS ON (CUSTOMERS.ORDER_ID = ORDERS.ID) WHERE ORDERS.

我有两个子查询,它们是重复的,非常长,所以我想给它一个名称,然后在查询中引用该名称,如中所述

我有一个带有ID、Name、OrderID的Customers表

我有ID为的Orders表这是订单ID,所以它也是外键、价格、订单日期

这是我的原始查询,运行良好:

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 MAX_ORDER_DATE AS (
    SELECT ADD_MONTHS((SELECT MIN(ORDER_DATE) FROM ORDERS), 12*10) AS max_date
    FROM ORDERS
    WHERE ROWNUM = 1
), 
MAX_ORDER_PRICE AS (
    SELECT MAX(ORDERS.PRICE) AS max_price
    FROM ORDERS
    WHERE ORDERS.ORDER_DATE <= (SELECT max_date FROM MAX_ORDER_DATE)
) 

SELECT c.name, o.price
FROM CUSTOMERS c
INNER JOIN ORDERS o
    ON c.ORDER_ID = o.ID
WHERE
    o.PRICE = (SELECT max_price FROM MAX_ORDER_PRICE) AND
    o.ORDER_DATE <= (SELECT max_date FROM MAX_ORDER_DATE);

我注意到您的语法存在的主要问题是,对于每个常见的表表达式,您都会重复使用,而您只需要在定义的开头声明一次。此外,如果要使用在两个CTE中定义的单个值,则应该对这些CTE使用子查询。最后,我向您在CTE中选择的列添加了别名。

删除第二个别名,它应该可以工作。在CTE定义开始时,WITH应该只指定一次。我仍然收到一个错误,即MAX_ORDER_DATE是无效标识。是的,您有其他问题,我在下面发布了一个更正。