Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle GROUP BY给出错误ORA-00979:不是GROUP BY表达式_Sql_Oracle_Group By - Fatal编程技术网

Sql Oracle GROUP BY给出错误ORA-00979:不是GROUP BY表达式

Sql Oracle GROUP BY给出错误ORA-00979:不是GROUP BY表达式,sql,oracle,group-by,Sql,Oracle,Group By,假设我们有两张桌子 table1 ---------------------- |ID | Date | ---------------------- |1 |20110101| |1 |20110102| |1 |20110103| |2 |20110102| |2 |20110103| |2 |

假设我们有两张桌子

table1
    ----------------------
    |ID         | Date   |
    ----------------------
    |1          |20110101|
    |1          |20110102|
    |1          |20110103|
    |2          |20110102|
    |2          |20110103|
    |2          |20110104|
    ----------------------

table2
    ----------------------
    |ID2        |val     |
    ----------------------
    |1          |152     |
    |2          |155     |
    ----------------------
使用此查询

SELECT * FROM table1, table2
WHERE table1.ID = table2.ID2
GROUP BY table1.ID 
ORDER BY DATE DESC
Mysql应该返回这个

-------------------------------------------
|ID         |date    |ID2        |val     |
-------------------------------------------
|1          |20110103|1          |152     |
|2          |20110104|2          |155     |
-------------------------------------------
在Oracle中,我遇到以下错误:
ORA-00979:不是表达式分组

编辑: 列
Date
上的
MAX
函数不起作用,因为该列是
varchar(200)

数据库/表结构不是我的,我无法更改它。

请按以下方式尝试:

   SELECT *
     FROM table1
LEFT JOIN table2 
       ON table1.ID = table2.ID
 ORDER BY DATE DESC
 GROUP BY table1.ID

请按以下方式尝试:

   SELECT *
     FROM table1
LEFT JOIN table2 
       ON table1.ID = table2.ID
 ORDER BY DATE DESC
 GROUP BY table1.ID

在带有group by的SQL语句的select and order by子句中,只能使用group by或其他列的聚合函数(min、max、avg..)中使用的列/表达式


我知道oracle的这一点,我有点惊讶,MySQL中的这一点与group by的SQL语句的select and order by子句中的有所不同。您只能使用group by中使用的列/表达式或其他列的聚合函数(min、max、avg…)


我知道这是针对oracle的,我有点惊讶于MySQL中的情况有所不同。oracle中的Group by意味着您试图在其中一列上运行聚合函数(sum、count等)。看起来您只是希望先按ID然后按日期订购。我会这样做:

SELECT * 
FROM   table1
       JOIN table2 ON (table1.ID = table2.ID2)
ORDER BY ID,
         DATE DESC
如果这不是您想要的,那么答案是您需要select子句中不属于聚合函数的每一列都位于group子句中

编辑

针对该评论:

最好先将表1作为子查询进行筛选,然后连接到表2:

SELECT *
FROM   (SELECT DISTINCT ID,MAX(TO_DATE(DATE,'mm-dd-yyyy')) FROM Table1 GROUP BY ID) T1
       JOIN Table2 ON (T1.ID = Table2.ID2)
ORDER BY date DESC

oracle中的Group by表示您正试图对其中一列运行聚合函数(sum、count等)。看起来您只是希望先按ID然后按日期订购。我会这样做:

SELECT * 
FROM   table1
       JOIN table2 ON (table1.ID = table2.ID2)
ORDER BY ID,
         DATE DESC
如果这不是您想要的,那么答案是您需要select子句中不属于聚合函数的每一列都位于group子句中

编辑

针对该评论:

最好先将表1作为子查询进行筛选,然后连接到表2:

SELECT *
FROM   (SELECT DISTINCT ID,MAX(TO_DATE(DATE,'mm-dd-yyyy')) FROM Table1 GROUP BY ID) T1
       JOIN Table2 ON (T1.ID = Table2.ID2)
ORDER BY date DESC

一般来说,将
select*from
groupby
结合使用是个坏主意。select子句中的表达式需要是标量表达式,也就是说,要么是group的聚合函数,要么与group无关,要么是group by子句本身<代码>选择*几乎可以保证不会出现这种情况。你可能想要这样的东西:

select t1.id, max(t1.date), t2.id, max(t2.val)
  from table1 t1
  join table2 t2 on t1.id=t2.id
  group by t1.id
  order by  max(t1.date) desc

一般来说,将
select*from
groupby
结合使用是个坏主意。select子句中的表达式需要是标量表达式,也就是说,要么是group的聚合函数,要么与group无关,要么是group by子句本身<代码>选择*几乎可以保证不会出现这种情况。你可能想要这样的东西:

select t1.id, max(t1.date), t2.id, max(t2.val)
  from table1 t1
  join table2 t2 on t1.id=t2.id
  group by t1.id
  order by  max(t1.date) desc

你需要做两件事中的一件

  • 分组并使用聚合函数将多个记录合并为一个记录
  • 使用一些查找来确定您想要从组中查找的一条记录

在您的情况下,您不仅仅需要表1中的MAX(),因为可能较高的
id
具有较低的
日期。在这种情况下,我倾向于使用查找系统

WITH
  ordered_table1 AS
(
  SELECT
    ROW_NUMBER() OVER (PARTITION BY id ORDER BY date_field DESC) AS sequence_number,
    *
  FROM
    table1
)
SELECT
  *
FROM
  ordered_table1
INNER JOIN
  table2
    ON table2.id = ordered_table1.id
WHERE
  ordered_table1.sequence_id = 1
注意:这假设您的日期格式为字母数字顺序将产生正确的日期顺序。如果情况并非如此(并且
d-m-yyyy
无法正确下单),则需要将
日期字段
替换为
截止日期(日期字段)
,以确保正确下单

注意:使用
到日期(日期字段)
也可能会解决MAX()问题


注意:如果您想将日期存储为字符串,但为了便于订购,请使用
yyyy-mm-dd

您需要做以下两件事之一

  • 分组并使用聚合函数将多个记录合并为一个记录
  • 使用一些查找来确定您想要从组中查找的一条记录

在您的情况下,您不仅仅需要表1中的MAX(),因为可能较高的
id
具有较低的
日期。在这种情况下,我倾向于使用查找系统

WITH
  ordered_table1 AS
(
  SELECT
    ROW_NUMBER() OVER (PARTITION BY id ORDER BY date_field DESC) AS sequence_number,
    *
  FROM
    table1
)
SELECT
  *
FROM
  ordered_table1
INNER JOIN
  table2
    ON table2.id = ordered_table1.id
WHERE
  ordered_table1.sequence_id = 1
注意:这假设您的日期格式为字母数字顺序将产生正确的日期顺序。如果情况并非如此(并且
d-m-yyyy
无法正确下单),则需要将
日期字段
替换为
截止日期(日期字段)
,以确保正确下单

注意:使用
到日期(日期字段)
也可能会解决MAX()问题


注意:如果您想将日期存储为字符串,但为了便于订购,请使用
yyyy-mm-dd

这不应该是
其中的table1.ID=table2.ID2
?是的,对不起,我忘记写了!!那不应该是table1.ID=table2.ID2吗?是的,对不起,我忘了写了!!是的,但这样我就得到了同一ID的多行,因为和ID可以有多个“日期”。。我只需要1行ID,所以使用MYSQL我使用了group by,它只返回了我的1record@Marcx-你的评论让我困惑,你是使用MySQL还是ORACLE?它们的行为不同,允许不同的语法,并且有不同的运算符可供使用……我使用的是Oracle。日期列是varchar,所以我不能使用max()。这个答案有
max(TO_date(date))
。使用TO_DATE()应该允许MAX()按照您的意愿进行操作。使用
选择不同的ID,MAX(TO_DATE(DATE,'yyyyymmdd'))从表1中返回一个
ORA-00937:没有一个组函数
,顺便说一句,MAX(TO_DATE())函数非常有效,除非我没有选择ID…Ye