2013-05-02 15 views
8

Jaki jest najlepszy sposób wybrania rekordów TOP N z UNION z 2 zapytań?WYBIERZ GÓRĘ ... OD UNII

nie mogę zrobić

SELECT TOP N ... FROM 
    (SELECT ... FROM Table1 
    UNION 
    SELECT ... FROM Table2) 

ponieważ oba pytania powrócić ogromne rezultaty muszę każdy kawałek optymalizacji możliwego i chciałby uniknąć powrocie wszystko. Z tego samego powodu nie mogę najpierw wstawiać wyników do tabeli #TEMP.

Nie mogę użyć SET ROWCOUNT N ponieważ mogę potrzebować zgrupować wyniki, a to polecenie ograniczy liczbę zgrupowanych wierszy, a nie leżące u ich podstaw selekcje wierszy.

Jakieś inne pomysły? Dzięki!

+2

Ja też "TOP" podselekty. – acdcjunior

+0

Dlaczego "UNION"? Czy chcesz usunąć zduplikowane wiersze? –

+1

Dlaczego nie możesz zrobić powyższego z "UNION ALL"? Przetestowałem powyższe zapytanie na tabeli z> 100000000 rekordami, a wynik pojawił się natychmiast. –

Odpowiedz

12

Użyj Top słowa kluczowego dla wewnętrznych zapytaniami także:

SELECT TOP N ... FROM 
(SELECT TOP N... FROM Table1 
UNION 
SELECT TOP N... FROM Table2) 
+1

Właściwie to myślę, że jest dokładnie to, czego potrzebuję. (patrz moje komentarze powyżej) Jeśli, na przykład, zażądałem SELECT TOP 10, a pierwsze zapytanie ma 20 rekordów, będzie ono również ograniczone przez TOP 10, więc uwzględnione zostaną tylko jego wyniki. Jeśli ma, powiedzmy tylko 3 rekordy, wygeneruje tylko 3 wyniki. Druga kwerenda da kolejne 10 wyników, dając łącznie 13, ale zewnętrzny poziom TOP 10 ograniczy go do 10-3 z 1 i 7 z 2. Przepraszam, myśląc głośno :) Thanks @ Deepak.Aggrawal –

+4

Microsoft SQL Server wymaga aliasu (np. AS UNIONRESULT) dla zestawu wyników, w przeciwnym razie daje błąd składni. – Edward

1

można spróbować wykonać następujące czynności. Używa CTE, który najpierw da wyniki obu zapytań, a następnie wybierzesz TOP N od CTE.

WITH table_cte (
(
    [col1], 
    [col2], 
    ... 
) 
AS 
(
    SELECT * 
    FROM table1 
    UNION ALL 
    SELECT * 
    FROM table2 
) 

SELECT TOP 1000 * FROM table_cte 
+0

Dzięki, ale pod względem wydajności jest to podobne do podzapytań - zapytania wewnętrzne zwracają wszystkie wyniki podstawowe, co nie jest optymalne –