2010-06-14 20 views
7

Recientemente he encontrado que SQLite no admite DISTINCT ON() cláusula que parece postgresql-specific. Por ejemplo, si tengo la tabla t con las columnas a y b. Y quiero seleccionar todos los elementos con distinto b. ¿Es la siguiente consulta la única y correcta forma de hacerlo en SQLite? datosCláusula DISTINCT en SQLite

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

muestra:

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

lo que espero a cambio:

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

Esa consulta siempre devolverá todas las filas de t , ya que cada b en t es parte de (seleccione distinto b de t). Tal vez pueda aclarar un poco más lo que está tratando de hacer, y proporcionar algunos datos de muestra y resultados esperados. – dcp

+1

A menos que explique por qué '(1,5)' está en su conjunto de resultados esperado mientras '(2,5)' no (y por qué es exactamente así, y no al revés), será difícil contestar. – Tomalak

+0

Cualquier restricción hará. Mínimo, máximo, etc. Se supone que la consulta real necesitará columnas adicionales en DISTINCT solo si dichos datos tienen un significado; por ejemplo, sus columnas adicionales son las mismas para las mismas columnas DISTINCT. – grigoryvp

Respuesta

8

Uso:

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)