查询在mySql中工作而在Oracle中不工作

查询在mySql中工作而在Oracle中不工作,mysql,sql,oracle,Mysql,Sql,Oracle,下面是在MySQL中工作而在Oracle中不工作的查询。 这里我需要从表r中获取最新的日期和相应的事件 对于表a中的每个ID。ID是唯一的 输出应该是这样的 -------------- 您的选择是: 你的组员是: 这些不兼容-select中除a.id之外的所有其他列的值是什么。MySQL支持这一点是数据库的一个错误特性,几乎任何其他数据库都不支持 最典型的解决方案是修复这些问题,使其兼容: select a.name, a.spids, a.group, a.id, max(r.date),

下面是在MySQL中工作而在Oracle中不工作的查询。 这里我需要从表r中获取最新的日期和相应的事件 对于表a中的每个ID。ID是唯一的

输出应该是这样的 --------------

您的选择是:

你的组员是:

这些不兼容-select中除a.id之外的所有其他列的值是什么。MySQL支持这一点是数据库的一个错误特性,几乎任何其他数据库都不支持

最典型的解决方案是修复这些问题,使其兼容:

select a.name, a.spids, a.group, a.id, max(r.date), max(r.event)
你的组员是:

在您的情况下,可能根本不需要group by:

SELECT a.name, a.spids, a.group, a.id, r.date, r.event  
FROM a LEFT OUTER JOIN
     (SELECT id, MAX(date) AS latest
      FROM r
      GROUP BY id
     ) rev
     ON rev.id = a.id LEFT JOIN
     r 
     ON r.id = rev.id  AND r.date = rev.latest
ORDER BY ID;
只有当有多行具有相同的最大日期时,才需要它

Oracle中最常见的解决方案解决了此问题:

SELECT a.name, a.spids, a.group, a.id, r.date, r.event  
FROM a LEFT JOIN
     (SELECT r.*,
             ROW_NUMBER() OVER (PARTITION BY r.id ORDER BY r.date DESC) as seqnum
      FROM r
     ) rev
     ON rev.id = a.id AND seqnum = 1
ORDER BY ID;

当你在做组时,你正在聚合结果,所以SELECT应该只考虑聚合列,这是A.ID,在这种情况下调用聚合函数。由于a.id在这个特定示例中是主键,所以如果您要求的话,可以在MySQL中的select子句中使用a的其他列,这是非常合乎逻辑的。然而,就MySQL中出错的可能性而言,这样的GROUPBY中的r列也是危险的,除非a的任何记录都有一个r。您可以通过在group by子句中列出select子句中使用的所有非聚合列来解决此问题。

您通常按所选列进行分组,但作为设置函数参数的列除外。谢谢。我尝试了选择a.name、a.spids、a.group、a.id、maxr.date、maxr.event和groupby as:groupby a.name、a.spids、a.group、a.id,效果很好
 group by a.id
select a.name, a.spids, a.group, a.id, max(r.date), max(r.event)
 group by a.name , a.spids , a.group , a.id
SELECT a.name, a.spids, a.group, a.id, r.date, r.event  
FROM a LEFT OUTER JOIN
     (SELECT id, MAX(date) AS latest
      FROM r
      GROUP BY id
     ) rev
     ON rev.id = a.id LEFT JOIN
     r 
     ON r.id = rev.id  AND r.date = rev.latest
ORDER BY ID;
SELECT a.name, a.spids, a.group, a.id, r.date, r.event  
FROM a LEFT JOIN
     (SELECT r.*,
             ROW_NUMBER() OVER (PARTITION BY r.id ORDER BY r.date DESC) as seqnum
      FROM r
     ) rev
     ON rev.id = a.id AND seqnum = 1
ORDER BY ID;