2011-10-08 7 views
5

Voglio ORDER BY il risultato di una query MINUS.Come si ordina in una query usando MINUS?

Il mio primo tentativo non funziona:

SELECT * 
FROM Table1 
MINUS 
SELECT * 
FROM table2 
WHERE table2.foo = 'bar' 
ORDER BY foo 

Come lo fareste?

oops: Stavo facendo ORDER BY table2.foo invece di solo ORDER BY foo. Ora funziona.

+0

sono entrambi la stessa tabella, immagino? quindi perché usi meno? – frail

+0

scusa, cattivo esempio. L'ho cambiato – ladookie

+0

quello che stai facendo è fondamentalmente un'operazione costosa, richiede una scansione completa della tabella. quindi se puoi pubblicare alcuni dati di esempio forse può essere risolto con un join. (a seconda dei dati) E hai bisogno di tutti i dati? si può avere un limite che eviterebbe la scansione della tabella completa – frail

risposta

8

Tuttavia, per rispondere alla tua domanda, è possibile utilizzare una con query:

with tmp_minus as (
    SELECT * 
    FROM Table1 
    MINUS 
    SELECT * 
    FROM table2 
    WHERE table2.foo = 'bar' 
) 
select * from tmp_minus 
ORDER BY foo 

si dovrebbe anche essere in grado di fare una selezione secondaria:

select * from (
    SELECT * 
    FROM Table1 
    MINUS 
    SELECT * 
    FROM table2 
    WHERE table2.foo = 'bar' 
) tmp_minus 
ORDER BY foo 
1

Se la MINUS sono stati sostituiti da UNION, l'ORDINE BY si applicherebbe al risultato dell'UNIONE. Sei sicuro che non è quello che ottieni con MINUS?

Se non funziona direttamente, quindi:

SELECT result.* 
    FROM (SELECT * 
      FROM Table1 
     MINUS 
     SELECT * 
      FROM table2 
     WHERE table2.foo = 'bar') AS result 
ORDER BY foo; 

Tuttavia, credo che questo è improbabile che sia necessario.

1

È possibile utilizzare la posizione anziché il nome della colonna. Supponendo che foo è la prima colonna nei risultati:

SELECT * 
FROM Table1 
MINUS 
SELECT * 
FROM table2 
WHERE table2.foo = 'bar' 
ORDER BY 1 

Normalmente non desidera che i risultati a dipendono da un ordine di colonna specifica, quindi vorrei usare solo questo per le query ad hoc.