【问题标题】:SQL multi table query problem using Inner Join使用Inner Join的SQL多表查询问题
【发布时间】:2020-08-10 08:27:00
【问题描述】:

我正在尝试使用 Inner Join 解决这个问题,但我不断收到错误

列出总额超过 500 美元的每个订单的客户编号、订单编号、订单日期和订单总额。将列名 ORDER_TOTAL 分配给显示订单总计的列。按订单号排序结果。

ORDERS 表有 CUSTOMER_NUM、ORDER_NUM 和 ORDER_DATE

ORDER_LINE 有 ORDER_NUM、ITEM_NUM、NUM_ORDERED 和 QOUTED_PRICE

这是我的解决方案:

SELECT CUSTOMER_NUM, ORDERS.ORDER_NUM, ORDER_DATE, SUM(QUOTED_PRICE) AS ORDER_TOTAL     
FROM ORDERS     
INNER JOIN ORDER_LINE ON ORDERS.ORDER_NUM = ORDER_LINE.ORDER_NUM    
GROUP BY ORDER_NUM     
HAVING ORDER_TOTAL > 500;

我遇到的错误:

Error starting at line : 61 in command -    
SELECT CUSTOMER_NUM, ORDERS.ORDER_NUM, ORDER_DATE, SUM(QUOTED_PRICE) AS ORDER_TOTAL     
FROM ORDERS     
INNER JOIN ORDER_LINE ON ORDERS.ORDER_NUM = ORDER_LINE.ORDER_NUM    
GROUP BY ORDER_NUM     
HAVING ORDER_TOTAL > 500

Error at Command Line : 65 Column : 8
Error report -

SQL Error: ORA-00904: "ORDER_TOTAL": invalid identifier    
00904. 00000 -  "%s: invalid identifier"

有什么建议吗?

【问题讨论】:

    标签: sql oracle join group-by sum


    【解决方案1】:

    Oracle 不允许在GROUP BY 子句中重用SELECT 子句中定义的别名。您需要重复表达式。此外,所有非聚合列都必须出现在GROUP BY 子句中。

    所以:

    SELECT o.CUSTOMER_NUM, o.ORDER_NUM, o.ORDER_DATE, SUM(ol.QUOTED_PRICE) AS ORDER_TOTAL
    FROM ORDERS o
    INNER JOIN ORDER_LINE ol ON ol.ORDER_NUM = o.ORDER_NUM
    GROUP BY o.CUSTOMER_NUM, o.ORDER_NUM, o.ORDER_DATE
    HAVING SUM(ol.QUOTED_PRICE) > 500;
    

    请注意,我修改了您的查询以使用表别名,并在每列前面加上它所属的表;这些是使查询更易于阅读和编写的良好做法,并避免了每列属于哪个表的歧义。

    【讨论】:

      猜你喜欢
      • 2012-11-04
      • 1970-01-01
      • 2014-02-24
      • 2011-03-25
      • 2018-01-27
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      相关资源
      最近更新 更多