SQL:MAX 与 SELECT TOP 1

Posted

技术标签:

【中文标题】SQL:MAX 与 SELECT TOP 1【英文标题】:SQL: MAX versus SELECT TOP 1 【发布时间】:2015-06-08 07:56:30 【问题描述】:

我对 SQL 不是很熟悉,所以请原谅我的新手问题。也适用于我的基本英语。

我需要从表中提取具有最大日期的行的值。问题是我只能选择一些行,并且条件也会考虑其他表,因此为了获得正确的行,我必须与这些其他表进行一些连接。

通常(仅使用一个表),为了解决这个问题,我使用如下 SQL 语句:

SELECT t1.value
FROM table t1
INNER JOIN (SELECT MAX(date) as maxDate
    FROM table
    WHERE field=3) t2
ON t1.date=t2.maxDate
WHERE t1.field=3

现在,就我所说的情况而言,我需要执行以下操作:

SELECT t1.value
FROM table t1
INNER JOIN otherTable o1 ON o1.key=t1.oKey
INNER JOIN (SELECT MAX(date) as maxDate
    FROM table t2
    INNER JOIN otherTable o2 ON o2.key=t2.oKey
    WHERE t2.field=3 and o2.oField=10) t3
ON t1.date=t3.maxDate
WHERE t1.field=3 and o1.oField=10

但这个解决方案对我来说似乎效率低下,因为我必须“复制”所有连接和连接条件。

还有其他方法可以做到这一点吗?我不需要提取所有结果(可能不止一个),所以我也想到了这个解决方案:

SELECT TOP 1 t.value
FROM table t
INNER JOIN otherTable o ON o.key=t.oKey
WHERE t.field=3 and o.oField=10
ORDER BY t.date DESC

但我不确定结果是否正确:它是否首先对结果进行排序,然后选择前 1 个?换句话说:我可以确定该行是具有最大日期的行吗?

另外,第二种方法实际上效率更高吗?

谢谢你们!!

【问题讨论】:

SELECT 语句总是在查询结束时执行,所以是的,如果你选择顶部,你将在排序后得到第一个 【参考方案1】:

这些帖子还讨论了 MAX 和 TOP 1 之间的区别:

MAX vs Top 1 - which is better?

SQL performance MAX()

【讨论】:

第二个链接更详细,现在我正在按照回复的建议进行一些检查。感谢您的帮助!【参考方案2】:

要回答您的问题,select top 1max 不是一回事。 Select top 1 将返回结果集的第一行,该行中的日期/数据无关紧要。

如果您使用select top 1 date from table order by date desc,您将获得max 日期,所以不用担心。

Select max(date) 将始终为您提供最高日期,或者准确地说是最后日期。

【讨论】:

感谢您的回复!虽然,我的标题对于我的真正问题并不是很具体,抱歉。无论如何,你能告诉我哪一种解决方案更有效吗?即使有大量的行?我担心有很多行的 order by 可能太慢了。 @sbiz 贴的链接里有详细解释,看看就好;)

以上是关于SQL:MAX 与 SELECT TOP 1的主要内容,如果未能解决你的问题,请参考以下文章

从 ASH 找到消耗 PGA 和 临时表空间 较多的 Top SQL_ID

SQL Select Top with Left Join 和 Where 子句

如何通过 Oracle 中的 SQL 查询找到每个 id 的 TOP/MAX 值?

sql SELECT TOP.sql

sql SELECT TOP,OFFSET,FETCH.sql

SQL Select Query 中 Top 1 1 和 Select 1 之间的差异