5

我有一个表有TAB两个字段A,是一个B,是一个。AVarchar2(50)BDate

假设我们有这些值:

 A  |      B
------------------
 a1 | 01-01-2013
 a2 | 05-05-2013
 a3 | 06-06-2013
 a4 | 04-04-2013

我们需要字段的值A对应字段的最大值B,也就是说我们需要返回a3

我提出了这个要求:

select A 
from TAB 
where 
B = (select max(B) from TAB)

但我想避免像这个解决方案中那样嵌套选择。

您对解决方案有想法吗?

谢谢

4

3 回答 3

2

我制作了一个sqlfiddle,其中列出了 4 种不同的方法来实现你想要的。请注意,我在您的示例中添加了另一行。所以你有两行最大日期。看到查询之间的区别了吗?尽管有 2 行符合条件,但 Manoj 的方式只会给您一行。您可以单击“查看执行计划”以查看 SQL Server 处理这些查询的不同之处。

4 种不同的方式(用标准 SQL 编写,它们应该适用于每个 RDBMS):

select A 
from TAB 
where 
B = (select max(B) from TAB);


select top 1 * from tab order by b desc;


select 
*
from
tab t1
left join tab t2 on t1.b < t2.b
where t2.b is null;


select
*
from
tab t1
inner join (
  select max(b) as b from tab
  ) t2 on t1.b = t2.b;

多亏了 a_horse_with_no_name,这里还有另外两种方法,特别是对于 SQL Server:

select *
from (
  select a, 
         b,
         rank() over (order by b desc) as rnk  
  from tab
) t
where rnk = 1;

select *
from (
  select a,
         b, 
         max(b) over () as max_b
  from tab
) t
where b = max_b;

看到他们在这里工作。

于 2013-07-01T08:53:15.053 回答
1

你也可以试试这个方法

SELECT TOP 1 A FROM TAB ORDER BY B DESC

谢谢

马诺伊

于 2013-07-01T07:54:57.463 回答
0

这对你来说很好......试试看

SELECT TOP 1 A,B FROM TAB ORDER BY B DESC
于 2013-07-01T09:09:08.920 回答