Trong SQL chuẩn có không có dấu ngoặc đơn trong DISTINCT colA
. DISTINCT
không phải là chức năng.
SELECT DISTINCT colA
FROM mytable
WHERE colA NOT IN (SELECT DISTINCT colB FROM mytable);
Đã thêm DISTINCT
vào phụ chọn. Nếu bạn có nhiều bản sao, nó có thể tăng tốc truy vấn.
CTE có thể nhanh hơn, tùy thuộc vào DBMS của bạn. Tôi bổ sung chứng minh LEFT JOIN
như thay thế để loại trừ các giá trị trong valB
, và một cách khác để có được giá trị khác biệt với GROUP BY
:
WITH x AS (SELECT colB FROM mytable GROUP BY colB)
SELECT m.colA
FROM mytable m
LEFT JOIN x ON x.colB = m.colA
WHERE x.colB IS NULL
GROUP BY m.colA;
Hoặc đơn giản hơn nữa, và với một subquery đồng bằng (có thể là nhanh nhất):
SELECT DISTINCT m.colA
FROM mytable m
LEFT JOIN mytable x ON x.colB = m.colA
WHERE x.colB IS NULL;
có cơ bản 4 kỹ thuật để loại trừ hàng với các phím xuất hiện trong một (hoặc tương tự) bảng:
Các yếu tố quyết định cho tốc độ sẽ chỉ số. Bạn cần có chỉ mục trên colA
và colB
để truy vấn này diễn ra nhanh chóng.
Nguồn
2012-01-05 03:07:45
'NOT IN' chậm lại khi kích thước thiết lập tăng lên và thường có giới hạn về số lượng hàng có thể nằm trong mệnh đề' NOT IN'. Bên ngoài các bộ kết quả nhỏ, tôi đã tìm thấy nó tốt hơn để sử dụng các phương tiện khác để có được sự khác biệt giữa hai bộ kết quả. – Paul
Khi nói về hiệu suất, bạn phải đặt tên cho RDBMS của bạn hoặc nhận được câu trả lời tối ưu. –