如何使用“having”子句将“group by”替换为嵌套选择?

时间:2011-02-16 17:45:50

标签: sql optimization

我的SQL变得有点生疏,这是我设法从表中检索最新记录的 ids (基于 date 字段)的唯一方法相同的类型使用嵌套选择,但我怀疑必须有一种方法可以使用having子句或更高效的方法执行相同操作。

假设唯一的列是IDTYPEDATE,我当前的查询是:

select ID from MY_TABLE,
               (select TYPE as GROUP_TYPE,
                  max(DATE) as MAX_DATE
                from MY_TABLE group by TYPE)
          where TYPE = GROUP_TYPE
            and DATE = MAX_DATE

(我是从我的记忆中写的,也许有一些语法错误,但你明白了)

3 个答案:

答案 0 :(得分:3)

  

我更倾向于坚持使用没有专有扩展的纯标准SQL。

然后没有“更有效”的方式来编写此查询。不在标准ANSI-SQL中。问题是您正在尝试将AGGREGATE列(最大日期)与基本列(日期)进行比较以返回另一个基本列(ID)。 HAVING子句无法处理这种类型的比较。

有一些方法可以使用ROW_NUMBER(窗口函数)或MySQL(由hack分组)来实现,但这些方法不能跨数据库系统移植。

答案 1 :(得分:0)

根据您的数据

,这可以让您更近
select ID from MY_TABLE
where (DATE = (select max(DATE) from MY_TABLE as X
               where X.TYPE = MY_TABLE.TYPE)

答案 2 :(得分:0)

SELECT a.id, a.type, a.dater
from my_table a inner join
(
select type, max(dater) as dater2
from my_table
group by type
) b
on a.type= b.type and a.dater= b.dater2