2010-06-14 37 views
7

Gần đây tôi thấy rằng SQLite không hỗ trợ mệnh đề DISTINCT ON() có vẻ như đặc biệt là postgresql. Đối với exeample, nếu tôi có bảng t với các cột ab. Và tôi muốn chọn tất cả các mục với riêng biệt b. Truy vấn sau là cách duy nhất và chính xác để thực hiện điều đó trong SQLite? dữ liệumệnh đề DISTINCT trong SQLite

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

mẫu:

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

gì tôi mong đợi để đổi lại:

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

truy vấn đó sẽ luôn luôn trở lại tất cả các hàng từ t , vì mỗi b trong t là một phần của (chọn b khác biệt từ t). Có lẽ bạn có thể làm rõ thêm một chút về những gì bạn đang cố gắng làm, và cung cấp một số dữ liệu mẫu và kết quả mong đợi? – dcp

+1

Trừ khi bạn giải thích tại sao '(1,5)' nằm trong tập kết quả mong đợi của bạn trong khi '(2,5)' không (và tại sao nó chính xác theo cách này, và không phải là cách khác), điều này sẽ khó để trả lời. – Tomalak

+0

Bất kỳ eo biển nào cũng sẽ làm. Tối thiểu, tối đa vv Giả sử truy vấn thực sẽ cần thêm cột trên DISTINCT chỉ khi dữ liệu đó có ý nghĩa - ví dụ, các cột bổ sung giống nhau cho các cột DISTINCT giống nhau. – grigoryvp

Trả lời

8

Sử dụng:

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) 
Các vấn đề liên quan