2012-07-08 40 views
7

bảng của tôi:Kiểm tra cột cho giá trị duy nhất

id attribute 
1 2 
1 2 
2 3 
2 4 
5 1 
5 1 
6 3 
6 3 
6 5 

Bây giờ tôi muốn chỉ ra những id với attribute, nếu thuộc tính là như nhau cho mỗi id.

Trong bảng mẫu này, sản lượng sẽ là

id attribute 
1 2 
5 1 

Trả lời

7

Bạn có thể sử dụng phương pháp này:

SELECT DISTINCT id, attribute 
FROM test t1 
WHERE (SELECT count(DISTINCT attribute) 
     FROM test t2 
     WHERE t2.id = t1.id) = 1 

Một cách tiếp cận tốt hơn có thể là:

SELECT 
    DISTINCT t1.id, t1.attribute 
FROM 
    test t1, 
    (
     SELECT 
     id, 
     count(DISTINCT attribute) COUNT 
     FROM 
     test 
     GROUP BY 
     id 
     HAVING 
     COUNT = 1 
    ) t2 
WHERE 
    t1.id = t2.id 
+1

Phương pháp này rất hiệu quả, bởi vì nó sẽ chạy truy vấn bên trong cho mỗi hàng trong thử nghiệm. Điều này sẽ bắt đầu tác động đến hiệu suất khá nhanh khi bảng phát triển. – Braiba

+0

@Braiba: Bạn nói đúng. Cách tiếp cận thứ hai có thể làm giảm sự phức tạp. –

+0

Truy vấn bên trong có chức năng giống như truy vấn đầu tiên của ypercube; Tôi không thấy những gì các truy vấn bên ngoài thêm ở đây, hoặc tôi thiếu một cái gì đó? – Braiba

1

Vâng, tôi d sử dụng cách tiếp cận sau để thay thế:

 SELECT DISTINCT ta.id, ta.attribute 
     FROM test ta 
    LEFT JOIN test tb 
     ON ta.id = tb.id AND ta.attribute <> tb.attribute 
     WHERE tb.id IS NULL; 

... vì tôi thường có xu hướng ít nhất là cố gắng thay thế truy vấn lồng nhau bằng các bảng đã tham gia. Tất nhiên, nếu bàn của bạn là nhỏ, nó sẽ không quan trọng nhiều.

+0

Truy vấn lồng nhau là tốt miễn là bạn tham gia vào chúng, thay vì đặt chúng trong mệnh đề SELECT/WHERE/ON. Tham gia một bảng vào chính nó như thế này là không tốt hơn nhiều mặc dù; thời gian xử lý sẽ vẫn tăng theo cấp số nhân khi bảng tăng lên. – Braiba

8
SELECT id, MIN(attribute) AS attribute 
FROM test 
GROUP BY id 
HAVING COUNT(DISTINCT attribute) = 1 ; 

hay:

SELECT id, MIN(attribute) AS attribute 
FROM test 
GROUP BY id 
HAVING MIN(attribute) = MAX(attribute) ; 

Tôi mong chờ phiên bản cuối cùng là khá hiệu quả với một chỉ mục trên (id, attribute)

+0

+1 cho cách hiệu quả nhất để thực hiện việc này. MIN = MAX điều thực sự thông minh; Tôi sẽ nhớ lại mẹo đó cho tương lai. – Braiba

+0

Tôi thực sự thích câu trả lời này. Nghi thức trên SO là gì? Đầu tiên đến trước phục vụ hoặc trả lời tốt nhất? –

+0

@Terry Uhlang Câu trả lời hay nhất có ý nghĩa nhất đối với tôi vì nó sẽ là người đầu tiên sử dụng cùng một vấn đề khác sẽ thấy khi họ tìm kiếm câu hỏi này. – Braiba

Các vấn đề liên quan