【问题标题】:Assign a Name to the Sub queries in Oracle为 Oracle 中的子查询分配名称
【发布时间】: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


【解决方案1】:

您更正的查询:

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);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多