2012-05-07 45 views
5

Tôi đã đấu tranh với điều này trong một thời gian nhưng tôi không thể hình dung ra.SQL trùng lặp từ hai cột

Tôi có bảng có 3 cột. 2 cột chứa tên và cột thứ ba chứa khoảng cách Damerau Levensthein (http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance) giữa các tên đó.

mỗi cột đã bao gồm mọi tên duy nhất, điều đó có nghĩa là tất cả các tên có mặt trong cột autor1 cũng có mặt trong cột autor2. kết quả là tôi có hai lần các hàng cần thiết, chỉ với các cột autor1 và autor2 được hoán đổi.

làm ví dụ, hàng 3 bằng hàng 1 chỉ với các cột tự động đổi chỗ, tương tự với 2-4. làm thế nào tôi sẽ xây dựng một truy vấn bỏ qua những "trùng lặp" đó?
id- | ------ autor1 ---- | ------ autor2 ----- | dld
1 - | Abel, Gustav - | Abel, Gustave | 1
2 - | Abel, Gustav - | Abele, Gustav | 1
3 - | Abel, Gustave | Abel, Gustav - | 1
4 - | Abele, Gustav | Abel, Gustav - | 1

đến
| ------ autor1 ---- | ------ autor2 ----- | dld
| Abel, Gustav - | Abel, Gustave | 1
| Abel, Gustav - | Abele, Gustav | 1

Trả lời

10

Sử dụng NOT EXISTS hoạt động trên tất cả các DBMS mà tôi biết. Sự phức tạp của điều này là không được quên bao gồm một điều khoản trên id. Không có nó, sẽ không có gì được trả lại.

SELECT * 
FROM YourTable yto 
WHERE NOT EXISTS (
     SELECT * 
     FROM YourTable yti 
     WHERE yti.autor2 = yto.autor1 
       AND yti.id > yto.id 
     ) 

Sửa

từng bước, sau đây là một phân tích về logic đằng sau những tuyên bố

  1. Lấy ghi đầu tiên (ID = 1)
  2. Có một kỷ lục mà ID > 1autor1 = autor2 (Có, ID 3) ->Bỏ qua
  3. Nhận bản ghi tiếp theo (ID = 2)
  4. Có một kỷ lục mà ID > 2autor1 = autor2 (Vâng, ID 4) ->Bỏ qua
  5. Nhận bản ghi tiếp theo (ID = 3)
  6. Có một kỷ lục mà ID > 3autor1 = autor2 (Không) ->Bao gồm
  7. Nhận bản ghi tiếp theo (ID = 4)
  8. có một kỷ lục nơi 01.238.và autor1 = autor2 (Không) ->Bao gồm
+1

bạn là một thiên tài. mặc dù tôi e rằng tôi không hoàn toàn hiểu được cách phép thuật "lớn hơn". – lightxx

+1

@lightxx - Tôi đã thêm phân tích logic đằng sau câu lệnh. Hy vọng rằng, nó xóa mọi thứ lên một chút. –

+0

cảm ơn, một lần nữa.bạn đá !! – lightxx

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