我们假设我们有两个表
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: not a GROUP BY expression
编辑:
列MAX
上的Date
函数不起作用,因为此列为varchar(200)
数据库/表格结构不是我的,我不能改变它。
答案 0 :(得分:2)
你需要做两件事之一......
在您的情况下,您不仅需要来自table1的MAX(),因为可能可能更高的id
具有更低的date
。在那种情况下,我倾向于使用查找系统...
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
将 正确订购),则需要将date_field
替换为TO_DATE(date_field)
以确保正确的顺序。
注意:使用TO_DATE(date_field)
也可能会解决您的MAX()问题。
注意:如果您希望将日期存储为字符串,但要将其设置为订单友好,请使用yyyy-mm-dd
答案 1 :(得分:1)
以下列方式尝试:
SELECT *
FROM table1
LEFT JOIN table2
ON table1.ID = table2.ID
ORDER BY DATE DESC
GROUP BY table1.ID
答案 2 :(得分:1)
在带有group by的SQL语句的select和order by子句中,您只能使用group by中使用的列/表达式或其他列的聚合函数(min,max,avg ..)。
我知道这对于oracle而且我有点惊讶,这在MySQL中是不同的
答案 3 :(得分:0)
在oracle中分组意味着您正在尝试在其中一列上运行聚合函数(求和,计数等)。您似乎只想先按ID排序,然后再按日期排序。我会做这样的事情:
SELECT *
FROM table1
JOIN table2 ON (table1.ID = table2.ID2)
ORDER BY ID,
DATE DESC
如果那不是您想要的,那么答案是您需要select子句中不属于聚合函数的每一列都在group子句中。
修改
回应评论:
最好先将表1作为子查询过滤掉,然后加入table2:
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
答案 4 :(得分:0)
一般来说,将select * from
与group by
结合使用是一个坏主意。 select子句中的表达式必须是标量,即组的聚合函数,或与分组无关,或者在group by子句本身。 Select *
几乎可以保证不会出现这种情况。你可能想要这样的东西:
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