【问题标题】:I'm getting error ORA-00979 and I can not fix it [duplicate]我收到错误 ORA-00979,我无法修复它[重复]
【发布时间】:2019-06-01 01:49:52
【问题描述】:

我的查询如下:

SELECT 
    s.NUM_STATION, extract(year from r.DATER), cl.NB_RESERV
FROM 
    STATION s, HOTEL h, CHAMBRE c, RESERVATION r, CLIENTS cl, PAYEMENT p 
WHERE 
    s.NUM_STATION = h.NUM_STATION 
    AND h.NUM_HOTEL = c.NUM_HOTEL 
    AND c.IDCHAMBRE = r.IDCHAMBRE 
    AND r.NUMC = cl.NUMC 
    AND cl.NUMC = p.NUMC
GROUP BY 
    s.NUM_STATION;  

我收到以下错误:

ORA-00979:不是 GROUP BY 表达式
00979. 00000 - “不是 GROUP BY 表达式”
*原因:
*操作:行错误:48 列:41

【问题讨论】:

  • 您只能选择group by子句或聚合函数中的值
  • 顺便说一句,不要使用旧语法。使用现代的join 语法
  • Bad habits to kick : using old-style JOINs - 旧式 逗号分隔的表格列表 样式已替换为 ANSI 中的 proper ANSI JOIN 语法-92 SQL 标准(25 多年前),不鼓励使用它

标签: sql database oracle date join


【解决方案1】:

您可以将查询简化为:

SELECT DISTINCT h.NUM_STATION, extract(year from r.DATER), cl.NB_RESERV
FROM HOTEL h JOIN
     CHAMBRE c
     h.NUM_HOTEL = c.NUM_HOTEL JOIN
     RESERVATION r
     ON c.IDCHAMBRE = r.IDCHAMBRE JOIN
     CLIENTS cl
     ON r.NUMC = cl.NUMC ;

也就是说,表STATIONPAYEMENT 不需要用于此查询,假设它们不用于过滤。 NUM_STATION 列在HOTEL 中应该是正确的——对于任何合理的数据模型。 PAYEMENT可以用于过滤;如果这是意图,那么它应该留在里面。

【讨论】:

  • 是否需要它们取决于查询的语义。如果这些表中不存在相应的行,则不会返回相同的结果。
【解决方案2】:

每个非聚合列都必须出现在GROUP BY 子句中。

但是您的查询不使用聚合函数,所以我认为您需要SELECT DISTINCT

您的查询已更新(也使用显式 JOINs 而不是 old-style joins):

SELECT DISTINCT
    s.NUM_STATION,
    extract (year from r.DATER),
    cl.NB_RESERV
FROM 
    STATION s
    INNER JOIN HOTEL h       ON s.NUM_STATION=h.NUM_STATION 
    INNER JOIN CHAMBRE c     ON h.NUM_HOTEL=c.NUM_HOTEL
    INNER JOIN RESERVATION r ON c.IDCHAMBRE=r.IDCHAMBRE
    INNER JOIN CLIENTS cl    ON r.NUMC=cl.NUMC
    INNER JOIN PAYEMENT p    ON cl.NUMC=p.NUMC

【讨论】:

    猜你喜欢
    • 2019-05-29
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 2021-01-14
    • 2014-03-24
    • 2021-09-12
    • 2021-03-21
    • 1970-01-01
    相关资源
    最近更新 更多