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 1
和 max
不是一回事。 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 值?