【问题标题】:ORA-00979: not a GROUP BY expression? [duplicate]ORA-00979: 不是 GROUP BY 表达式? [复制]
【发布时间】:2011-04-24 16:49:37
【问题描述】:

我已经找到了解决方案,但是如果其中一列是子查询,我如何将其包含在 group by 中,或者我是否需要将其包含在 group by 中。我将在此处粘贴查询..

SELECT s.customerid, s.denomid,
       (SELECT su.quantity
         FROM   stockupdations su
         WHERE  s.customerid = su.custid
         AND    s.denomid = su.denomid
         AND    s.curid = su.curid) AS cur_stock, c.name AS cus_name, d.denomname AS denom,
       cur.curcode AS currency
FROM   stock s
LEFT   JOIN customers c
ON     s.customerid = c.custid
LEFT   JOIN denomination d
ON     d.denomid = s.denomid
LEFT   JOIN currency cur
ON     cur.curid = s.curid
GROUP  BY s.denomid, s.customerid, c.name, d.denomname, cur.curcode
ORDER  BY s.customerid ASC

【问题讨论】:

  • 为什么在不使用任何聚合函数(如SUMCOUNT)的情况下使用GROUP BY?你想达到什么目的?请发布输入/预期输出。
  • @shahkalpesh:结果与使用DISTINCT 相同,只是输入更多-参见AskTom for more info。拥有 GROUP BY 子句不需要使用聚合函数。

标签: sql oracle group-by ora-00979


【解决方案1】:

WITH 语句呢?

WITH tmp AS
(
    SELECT s.customerid, s.denomid,
           c.name AS cus_name,
           d.denomname AS denom,
           cur.curcode AS currency
    FROM   stock s
    LEFT   JOIN customers c
    ON     s.customerid = c.custid
    LEFT   JOIN denomination d
    ON     d.denomid = s.denomid
    LEFT   JOIN currency cur
    ON     cur.curid = s.curid
    GROUP  BY s.denomid, s.customerid, c.name, d.denomname, cur.curcode
    ORDER  BY s.customerid ASC
)
SELECT tmp.customerid, tmp.denomid,
       su.quantity,
       tmp.cus_name,
       tmp.denom,
       tmp.currency
FROM   tmp
INNER  JOIN stockupdations su
ON     tmp.customerid = su.custid
AND    tmp.denomid = su.denomid
AND    tmp.curid = su.curid

【讨论】:

  • 子选择不能更改为INNER JOIN,因为如果STOCKUPDATIONS 表中没有基于条件的记录,子选择将返回null。这意味着您需要使用 OUTER 连接。
【解决方案2】:

您可以在 from 子句中使用“内部查询”,而不是在 select 上。

假设我有一个 CUSTOMER 表和 ORDER 表,

我可以有类似的东西

SELECT C.CUSTOMER_ID, COUNT(T.ORDER_ID)
FROM CUSTOMERS C
JOIN (SELECT CUSTOMER_ID, ORDER_ID, ORDER_DATE, ORDER_STATUS FROM ORDERS O WHERE O.STATUS <> 'DECLINED') T
ON T.CUSTOMER_ID = C.CUSTOMER ID
GROUP BY C.CUSTOMER_ID

(这个SQL只是一个例子,我知道有更好的方法来写这个,但我马上想不出任何其他例子)

【讨论】:

  • 不能将子选择更改为INNER JOIN,因为如果STOCKUPDATIONS 表中没有基于条件的记录,子选择将返回null。这意味着您需要使用 OUTER 连接。
【解决方案3】:

您不必一次做所有事情。尝试将您的查询分成多个部分。子查询、分析函数或其他复杂的逻辑在外部查询中看起来就像简单的行。 (不用担心性能,Oracle会重写它,如果有意义的话,一切都会一步到位。)

--Step 3
select [simple values]
from
(
  --Step 2
  select [insanity]
  from
  (
    --Step 1
    select [madness]
    from
    [impossible joins]
  )
)
group by [simple values]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-29
    • 2011-06-04
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    相关资源
    最近更新 更多