2012-11-19 10 views
8

Voglio scrivere una query comeUtilizzando ordine diverso da con l'unione

select top 10 * from A 
    order by price 
    union 
    select top 3 * from A 
    order by price 

o STH come quello

select top 10 * from A 
    where name like '%smt%' 
    order by price 
    union 
    select top 3 * from A 
    where name not like '%smt%' 
    order by price 

Potete per favore aiutarmi?

+0

In che ordine desideri il risultato finale? Se ci sono righe che appaiono in entrambe le sottoselezioni, dovrebbero apparire due volte nel risultato finale o solo una volta? –

+0

Penso che questo dovrebbe essere in realtà 2 query separate ... – ppeterka

risposta

10

questo dovrebbe funzionare:

SELECT * 
FROM (SELECT TOP 10 A.*, 0 AS Ordinal 
     FROM A 
     ORDER BY [Price]) AS A1 

UNION ALL 

SELECT * 
FROM (SELECT TOP 3 A.*, 1 AS Ordinal 
     FROM A 
     ORDER BY [Name]) AS A2 

ORDER BY Ordinal 

Da MSDN:

In una query che utilizza UNION, EXCEPT o intersecare operatori, ORDER BY è consentito solo alla fine dell'istruzione. Questa limitazione si applica a solo quando si specifica UNION, EXCEPT e INTERSECT in una query di livello superiore e non in una sottoquery.

A cura: per forzare l'ordine è necessario applicare un ORDER BY alla query esterna. Ho aggiunto una colonna con valore costante a entrambe le query.

+0

Ho l'impressione che l'OP vorrebbe ordinarli nel risultato finale (il prezzo 10 seguito dal nome 3) e non penso che questo possa 100 % garanzia del risultato –

+1

Esiste una garanzia * no * sull'ordine in cui i risultati vengono restituiti da un 'UNION ALL' (o' UNION') a meno che * it * abbia una clausola 'ORDER BY' applicata. –

+0

@Damien_The_Unbeliever: significa che non è garantito che entrambe le query vengano aggiunte? –

2

Questo è un vero e proprio modo hacky per farlo. Probabilmente si desidera come query separati in realtà, ma questo dovrebbe dare il risultato che si desidera ...

select * 
from (
    select top 10 *, 1 as 'ord', price as 'ordprice' from A 
    union 
    select top 3 *, 2 as 'ord', 0 as 'ordprice' from A 
) a 
order by ord, ordprice, name 
0
select top 10 *,0 as RS from A 
union 
select top 3 *,1 as RS from A 
order by 
    RS, 
    CASE WHEN RS=0 THEN price END, --Don't affect RS 1 
    name 
1

UNION non piace clausole ORDER BY nelle espressioni unioned. Prova questo:

SELECT * FROM 
    (SELECT TOP 10 * FROM A ORDER BY Price) SetA 
UNION 
SELECT * FROM 
    (SELECT TOP 3 * FROM a ORDER BY name) Setb 
[ORDER BY something] 

Questa falsifica l'operatore UNION nella ignorando le piazzole di sosta ordine, che operano ancora correttamente l'operatore TOP. È possibile applicare un ordine finale BY per ordinare il set UNION, se lo si desidera.

[Non si applica più esattamente alla tua domanda ora che è stata modificata!]

Problemi correlati