2012-09-03 9 views
1

으로 연합의 모든/주문 나는 같은 데이터를 두 개의 테이블이 -이를 반환하는 TestTable1 + TestTable2의 결과 집합 만 이 개 최신 기록을 갖고 싶어이 더 좋은 방법인가 -

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 

-

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 

수있는 사람하시기 바랍니다 g 이것을 달성하기위한 더 나은 방법 (성능 현명한/가독성)을위한 나를 도와 주시겠습니까?

P. 위의 표는 유스 케이스를 보여주기위한 것일뿐 실제 테이블에는 수천 개의 레코드가 있습니다.

감사합니다.

+3

실제로이 방법으로 성능 문제가 있습니까? – Oded

+0

두 개의 최신 거래가 같은 테이블에있는 경우 최신 두 개의 거래 만 원했습니까? 아니면 항상 TestTable1과 TestTable2 중 하나를 원하십니까? – Arj

답변

4

내가 현명하게 성능을 바꿀 유일한 것은 ORDER BYTOP 2을 내부 선택에서 제거하는 것입니다. 그들은 무의미합니다.
그 외의 경우 해결책이 필요합니다. 당신이 UNION ALL하지 UNION을 사용하는 당신은 항상 TestTable1 1 개 기록과 TestTable2 1 개 기록을 가지고 싶었다면

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! 내가 UNION ALL 이전에 불필요한 레코드를 걸러 내고 있기 때문에 하위 쿼리에서 * ORDER BY/TOP n *을 추가 했으므로 성능이 향상 될 것이라고 생각했기 때문에 추가했습니다. 하지만 당신이 지적한 바에 따르면, 나는 위의 쿼리를 테스트를 위해 TOP 90000 레코드가있는 실제 테이블에서 실행하고 실제로 기대했던 것보다 느리다는 것을 알았습니다. 그래서 내부 쿼리에서 * ORDER BY/TOP n *을 제거했습니다. 고맙습니다! – iniki

0

... 어떤 성능 문제가 없어야합니다, 당신은 시도 할 수 :

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 to dealdate desc 왜 ​​UNION ALL SELECT TOP 1 *에서 TestTable2 order by dealdate desc'를 선택해야합니까? –

+0

예, 사실입니다. – Arj

관련 문제