【问题标题】:query not work in oracle查询在 oracle 中不起作用
【发布时间】:2014-07-22 19:02:17
【问题描述】:
SELECT product_id,sum(quantity) AS total,price
FROM item,product
WHERE product.id=item.product_id
GROUP BY product_id

此查询在 mysql 中完美运行,但在 oracle 11g XE 中无法运行。 上面写着:

ORA-00979: 不是 GROUP BY 表达式

【问题讨论】:

    标签: sql oracle11g


    【解决方案1】:

    我猜你要么想要

    SELECT product_id, sum(quantity) AS total, sum(price) as total_price
    FROM item, product
    WHERE product.id = item.product_id
    GROUP BY product_id;
    

    或

    SELECT product_id, sum(quantity) AS total, price
    FROM item, product
    WHERE product.id = item.product_id
    GROUP BY product_id, price;
    

    【讨论】:

      【解决方案2】:

      就像其他人回答的那样,Oracle 要求您明确地GROUP BY 您选择的任何非聚合字段。如果您使用 ANSI 连接语法,您的 DBA 将是最快乐的:

      SELECT product_id, sum(quantity) AS total, price
        FROM item i
        JOIN product p ON (i.product_id = p.id)
       GROUP BY product_id, price;
      

      【讨论】:

      • 嗨,约书亚。为什么 DBA 会对连接的 ANSI 语法感到满意?
      • @nop77svk 由于 where 子句中缺少关系而导致意外笛卡尔连接的几率降低了 99%。我已将此链接发送给我店里的数十位开发人员:orafaq.com/node/2618(我是一名 DBA,您可能已经猜到了。)
      • 有一次我被要求帮助一位开发人员弄清楚为什么查询需要这么长时间。原来这是一个巨大的 7 表连接,带有旧语法。 where 子句中缺少连接条件之一,因此产生了笛卡尔连接。除非您仔细追踪所有 where 谓词,否则很难发现。使用 ANSI 语法时问题消失。
      • 所以我以为是关于笛卡尔的。我还要补充一点:ANSI 语法允许使用“传统”语法无法进行连接,例如左外连接来自 2+ 表的 2+ 列上的表。传统编写时在 11gR2 上简单失败。感谢你的回复。你知道,我只是想知道为什么特别是 DBA 会对此感到高兴,因为开发人员首先应该对此感到高兴,因为它(ANSI 语法)总是提高了查询的可读性。 :-) 但是,唉,我一生中遇到的大多数(专业)Oracle 开发人员都是沉迷于传统的字母表,无论如何可读性对他们来说并不重要。
      • 是的,有趣的是,这件事对人们来说是多么主观。有一些顽固的老派开发人员坚持认为遗留连接语法更容易阅读。我认为上面的 OraFAQ 链接说得最好:ANSI 语法允许您将连接条件保留在它们所属的表旁边,并且 WHERE 子句下的谓词真正充当过滤器。如果你想用遗留语法做一个 ANSI FULL JOIN,那么你必须 UNION 一起使用两个查询与连接 --> 丑陋的代码,除非你每行垃圾代码都得到报酬,否则不好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多