有没有更好的方法 - Union All / Order By

时间:2012-09-03 10:34:41

标签: sql sql-server-2008

我有两个数据表 -

TestTable1                          TestTable2  
----------                          ----------  
Id  Name        DealDate            Id  Name        DealDate  
1   aaTable     2010-09-22          1   aaTable2    2010-09-23  
2   bbTable     2010-09-23          2   bbTable2    2010-09-24  
3   ccTable     2010-09-28          3   ccTable2    2010-09-26  
4   ddTable     2010-09-25          4   ddTable2    2010-09-27  

我希望只有两个来自TestTable1 + TestTable2的结果集的最新记录才能返回 -

Id  Name        DealDate
4   ccTable     2010-09-28 
3   ddTable2    2010-09-27 

这是我当前的查询

SELECT TOP 2 * FROM 
(
    SELECT * FROM
    (SELECT TOP 2 Id, Name, DealDate FROM TestTable1 ORDER BY DealDate DESC) T1
    UNION ALL 
    SELECT * FROM
    (SELECT TOP 2 Id, Name, DealDate FROM TestTable2 ORDER BY DealDate DESC) T2
) T1T2
ORDER BY DealDate DESC

任何人都可以指导我一个更好的方法(明智的性能/可读性)来实现这个目标吗?

P.S。上面的表只是为了呈现用例,我的实际表有数千条记录。

谢谢!

2 个答案:

答案 0 :(得分:4)

我唯一能改变表现的方法是删除内部选择中的ORDER BYTOP 2 - 它们毫无意义。
除此之外,您的解决方案是可行的方法。使用UNION ALL而非UNION ...

时不应出现任何性能问题
SELECT TOP 2 * FROM 
(
    SELECT Id, Name, DealDate FROM TestTable1
    UNION ALL 
    SELECT Id, Name, DealDate FROM TestTable2
) T1T2
ORDER BY DealDate DESC

答案 1 :(得分:0)

如果您一直希望从TestTable1获得1条记录,从TestTable2获得1条记录,那么您可以尝试:

SELECT TOP 1 * FROM TestTable1 ORDER BY DealDate DESC
UNION ALL
SELECT TOP 1 * FROM TestTable2 ORDER BY DealDate DESC

否则其他答案应该是您正在寻找的。