2013-05-02 7 views
8

Qual è il modo migliore per selezionare i record TOP N da UNION di 2 query?SELEZIONA IN ALTO ... DALL'UNIONE

non posso fare

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

perché entrambe le query restituiscono risultati enormi ho bisogno ogni bit di ottimizzazione possibile e vorrei evitare di restituire tutto. Per lo stesso motivo, non posso inserire i risultati nella tabella #TEMP.

Non riesco a utilizzare SET ROWCOUNT N perché potrebbe essere necessario raggruppare i risultati e questo comando limiterà il numero di righe raggruppate e non le selezioni di righe sottostanti.

Altre idee? Grazie!

+2

I'd 'TOP' anche le sottoselezioni. – acdcjunior

+0

Perché "UNION"? Vuoi rimuovere le righe duplicate? –

+1

Perché non puoi fare sopra con 'UNION ALL'? Ho testato la query sopra su una tabella con> 100000000 record e il risultato è arrivato immediatamente. –

risposta

12

Utilizzare la parola chiave Top per le query interne anche:

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

In realtà questo penso sia esattamente ciò di cui ho bisogno. (vedendo i miei commenti sopra) Se, ad esempio, ho richiesto SELECT TOP 10 e la prima query ha 20 record, sarà anche limitata da TOP 10, quindi verranno inclusi solo i risultati. Se ha, diciamo solo 3 record, produrrà solo 3 risultati. La seconda query produrrà altri 10 risultati, dando un totale di 13, ma il livello esterno TOP 10 lo limiterà a 10 - 3 dal 1 ° e 7 dal 2 °. Scusa, pensando ad alta voce :) Grazie @ Deepak.Aggrawal –

+4

Microsoft SQL Server richiede un alias (ad esempio AS UNIONRESULT) per il set di risultati, in caso contrario viene visualizzato un errore di sintassi. – Edward

1

Si potrebbe provare quanto segue. Usa un CTE che ti darà prima i risultati di entrambe le query e poi selezionerai il tuo TOP N dal CTE.

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

SELECT TOP 1000 * FROM table_cte 
+0

Grazie, ma le prestazioni sono simili alle sottoquery: le query interne restituiscono tutti i risultati sottostanti, il che non è ottimale –