2011-08-16 31 views
14

Sau đây là một tình huống giả định, điều này gần với vấn đề thực sự của tôi. Table1Xóa các bản sao khỏi SQL Tham gia

recid firstname lastname company 
1  A    B   AAA 
2  D    E   DEF 
3  G    H   IJK 
4  A    B   ABC 

Tôi có một table2 mà trông như thế này

recid firstname lastname company 
10  A    B   ABC 
20  D    E   DEF 
30  M    D   DIM 
40  A    B   CCC 

Bây giờ nếu tôi tham gia bảng trên recid, nó sẽ cho kết quả 0, sẽ không có bản sao vì recid là duy nhất. Nhưng nếu tôi tham gia vào firstname và lastname cột, mà không phải là duy nhất và có bản sao, tôi nhận được bản sao vào bên trong tham gia. Càng nhiều cột tôi thêm vào tham gia, càng tệ thì càng trở thành (nhiều bản sao được tạo).

Trong tình huống đơn giản ở trên, làm cách nào tôi có thể xóa các mục trùng lặp trong truy vấn sau. Tôi muốn so sánh firstname và lastname, nếu họ khớp, tôi trở firstname, lastname và recid từ table2

select distinct * from 
(select recid, first, last from table1) a 
inner join 
(select recid, first,last from table2) b 
on a.first = b.first 

Script là ở đây nếu có ai muốn chơi với nó trong tương lai

create table table1 (recid int not null primary key, first varchar(20), last varchar(20), company varchar(20)) 
create table table2 (recid int not null primary key, first varchar(20), last varchar(20), company varchar(20)) 

insert into table1 values(1,'A','B','ABC') 
insert into table1 values(2,'D','E','DEF') 
insert into table1 values(3,'M','N','MNO') 
insert into table1 values(4,'A','B','ABC') 

insert into table2 values(10,'A','B','ABC') 
insert into table2 values(20,'D','E','DEF') 
insert into table2 values(30,'Q','R','QRS') 
insert into table2 values(40,'A','B','ABC') 
+1

Bạn cần recid lại - nếu không, loại bỏ nó từ truy vấn của bạn sẽ khắc phục sự cố. – Paddy

+0

có, nếu không tôi đã làm phần còn lại. –

+1

Bạn cần phải quyết định logic cho các hàng không song công của mình. CompanyId và RecId là khác nhau cho các bản dupes của bạn. Bạn muốn giữ cái nào trong số này> – JNK

Trả lời

14

Bạn không muốn tham gia một lần nữa, bạn chỉ đơn thuần là kiểm tra sự tồn tại/thiết lập.

Tôi không biết hương vị hiện tại của SQL bạn đang mã hóa, nhưng điều này sẽ hoạt động.

SELECT MAX(recid), firstname, lastname 
FROM table2 T2 
WHERE EXISTS (SELECT * FROM table1 WHERE firstname = T2.firstame AND lastname = T2.lastname) 
GROUP BY lastname, firstname 

Nếu bạn muốn thực hiện như một tham gia, để lại mã phần lớn giống nhau:

tức

SELECT max(t2.recid), t2.firstame, t2.lastname 
FROM Table2 T2 
INNER JOIN Table1 T1 
    ON T2.firstname = t1.firstname and t2.lastname = t1.lastname 
GROUP BY t2.firstname, t2.lastname 

Tùy thuộc vào DBMS, một bên tham gia có thể được thực hiện khác nhau với một Tồn tại (semi-join vs join) nhưng trình tối ưu hóa đôi khi có thể tìm ra và chọn toán tử đúng bất kể bạn viết nó như thế nào.

+0

Mã mẫu của anh ta có một lựa chọn * từ cả hai bộ dữ liệu nhưng mô tả của anh ấy nói "Tôi muốn so sánh tên và họ, nếu chúng khớp, tôi trả về firstname, lastname và recid * từ table2 *" –

+0

đây là nó. Tôi đoán tôi không cần tham gia, nhưng ai đó có thể giải thích nó tham gia cũng nếu nó có thể. –

+0

Mã mẫu của anh ta bằng cách sử dụng 'SELECT DISTINCT *' từ tập kết quả 'INNER JOIN'ed cho thấy rõ ràng anh ta muốn dữ liệu từ cả hai bảng. Nếu tôi sai và anh ta làm rõ tôi sẽ vui vẻ loại bỏ DV. – JNK

4
SELECT t2.recid, t2.first, t2.last 
FROM table1 t1 
INNER JOIN table2 t2 ON t1.first = t2.first AND t1.last = t2.last 
GROUP BY t2.recid, t2.first, t2.last 

EDIT: Thêm hình ảnh

enter image description here

+0

Tôi đã thử tương tự như truy vấn ban đầu của mình nhưng không hoạt động vì một lý do nào đó. –

+0

@ Vườn lang: bạn có nghĩa là truy vấn tôi đã cung cấp không hoạt động? Hình ảnh có đại diện cho tập hợp kết quả sai không? – sll

+0

Nó hoạt động. Vấn đề là tôi chỉ muốn giữ cho recid duy nhất. Phần còn lại có thể trùng lặp. Giống như tôi không muốn nhóm bởi t2.first và t2.last. Nhưng sử dụng nhóm theo, bạn phải sử dụng nó. –

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