2012-09-03 33 views
1

我有两个表的数据为 -有没有更好的办法 - UNION ALL /顺序按

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的结果集只有2个最新记录回到这一点 -

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.上面的表格只是介绍用例,我的实际表格有数千条记录。

谢谢!

+3

您是否真的有这种方法的性能问题? – Oded

+0

如果最近的两笔交易在同一张表中,您是否只需要那两张最新的交易?或者你是否总是想要TestTable1中的一个和TestTable2中的一个? – Arj

回答

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 
+0

Thnx您的回复!我在子查询中添加了* ORDER BY/TOP n *,因为我认为它会提供更好的性能,因为我在UNION ALL之前过滤掉了不必要的记录。但是在你指出之后,我用TOP 90000记录进行了一次测试,结果发现它实际上比我预期的要慢 - 所以我从内部查询中删除了* ORDER BY/TOP n *。谢谢! – iniki

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 

否则其他答案应该是你要找的。

+0

为什么不简单地'SELECT TOP 1 * FROM TestTable1 order by dealdate desc UNION ALL SELECT TOP 1 * FROM TestTable2 order by dealdate desc'? –

+0

是的,非常真实。 – Arj

相关问题