2010-06-14 63 views
7

最近我發現SQLite不支持DISTINCT ON()子句,它似乎是postgresql特有的。例如,如果我有表t與列ab。我想選擇不同b的所有項目。以下查詢是唯一一個在SQLite中這樣做的正確方法嗎?SQLite中的DISTINCT子句

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

的樣本數據:

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

我所期望的回報:

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

該查詢將始終從T迴流的所有行,因爲t中的每個b都是(從t中選擇不同的b)的一部分。也許你可以更清楚地說明你想要做什麼,並提供一些樣本數據和預期結果? – dcp 2010-06-14 15:46:10

+1

除非你解釋爲什麼'(1,5)'在你的預期結果集中而'(2,5)'不是(爲什麼它正是這種方式,而不是相反方向),這將是困難的回答。 – Tomalak 2010-06-14 15:58:04

+0

任何constrait都可以。最小值,最大值等。假設真正的查詢需要DISTINCT上的附加列,但前提是這些數據有意義 - 例如,對於相同的DISTINCT列,附加列是相同的。 – grigoryvp 2010-06-14 16:03:30

回答

8

用途:

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)