2010-06-14 14 views
7

Recentemente ho trovato che SQLite non supporta la clausola DISTINCT ON() che sembra specifica per Postgresql. Per esempio, se ho tabella t con colonne a e b. E voglio selezionare tutti gli elementi con distinti b. La seguente query è l'unico e il modo corretto per farlo in SQLite? DatiDISTINCT clausola in SQLite

select * from t where b in (select distinct b from t) 

Esempio:

a | b 
__|__ 
1 5 
2 5 
3 6 
4 6 

quello che mi aspetto in cambio:

a | b 
__|__ 
1 5 
3 6 
+4

Quella interrogazione restituirà sempre tutte le righe da t , poiché ogni b in t fa parte di (selezionare distinto b da t). Forse puoi chiarire un po 'di più quello che stai cercando di fare e fornire alcuni dati di esempio e risultati attesi? – dcp

+1

A meno che non spieghi perché '(1,5)' è nel tuo set di risultati atteso mentre '(2,5)' non lo è (e perché è esattamente così, e non viceversa), questo sarà difficile rispondere. – Tomalak

+0

Qualsiasi constrait farà. Minimo, massimo, ecc. Supposto che la query reale abbia bisogno di colonne aggiuntive su DISTINCT solo se tali dati hanno un significato - per esempio, le colonne aggiuntive sono le stesse per le stesse colonne DISTINCT. – grigoryvp

risposta

8

Usa:

SELECT MIN(t.a) AS A, 
     t.b 
    FROM TABLE t 
GROUP BY t.b 
9
 
sqlite> SELECT * FROM t GROUP BY b; 
2|5 
4|6 
(for each b: one (unpredictable) value of a) 

sqlite> SELECT * FROM (SELECT * FROM t ORDER BY a DESC) GROUP BY b; 
1|5 
3|6 
(for each b: the row with min a) 

sqlite> SELECT * FROM (SELECT * FROM t ORDER BY a ASC) GROUP BY b; 
2|5 
4|6 
(for each b: the row with max a)