2009-10-27 7 views
8

Tôi đang cố di chuyển một số dữ liệu giữa hai bảng SQL Server 2008. Nếu bản ghi tồn tại trong Table2 với email từ Bảng 1, sau đó cập nhật bản ghi đó với dữ liệu từ Bảng 1, hãy chèn một bản ghi mới.Nếu bản ghi tồn tại, hãy cập nhật phần khác Chèn

Trong Bảng 1, tôi có một số cột; họ, tên, email, v.v.

Tôi không chắc chắn cách cấu trúc truy vấn để cập nhật Bảng 2 nếu email từ Bảng 1 tồn tại hoặc chèn hàng mới nếu email từ Bảng 1 không tồn tại trong Bảng2.

Tôi đã thử thực hiện một vài tìm kiếm trên Google nhưng hầu hết các giải pháp dường như hoạt động bằng cách tạo một số thủ tục được lưu trữ. Vì vậy, tôi tự hỏi nếu có ai có thể biết làm thế nào để xây dựng một truy vấn phù hợp mà có thể làm các trick?

Trả lời

9
MERGE 
INTO table2 t2 
USING table1 t1 
ON  t2.email = t1.email 
WHEN MATCHED THEN 
UPDATE 
SET  t2.col1 = t1.col1, 
     t2.col2 = t1.col2 
WHEN NOT MATCHED THEN 
INSERT (col1, col2) 
VALUES (t1.col1, t1.col2) 
20

Tôi nghĩ rằng MERGE là những gì bạn muốn.

+0

+1 Giải pháp tốt. –

+0

Đây chính xác là những gì MERGE được thiết kế cho ... (một số ngành gọi đây là "UPSERT" mặc dù nó xử lý nhiều hơn chỉ là INSERT/UPDATE). –

1

Microsoft phát hành a tool to compare data giữa các bảng SQL, đây có thể là một lựa chọn tốt trong các tình huống nhất định.

Chỉnh sửa: Quên đề cập, nó cũng tạo tập lệnh để chèn/cập nhật các hàng bị thiếu hoặc khác nhau.

Để hoàn tất, tôi đã tấn công truy vấn này thực hiện những gì bạn muốn, nó cập nhật bản ghi table2 hiện có và thêm những người bị thiếu, dựa vào địa chỉ email.

Các truy vấn 'cập nhật' và 'chèn thiếu' bên dưới là những truy vấn bạn muốn.

BEGIN TRAN 

create table #table1 (id int, fname varchar(20), email varchar(20)) 
insert into #table1 values (1, 'name_1_updated', 'email_1') 
insert into #table1 values (3, 'name_3_updated', 'email_3') 
insert into #table1 values (100, 'name_100', 'email_100') 


create table #table2 (id int, fname varchar(20), email varchar(20)) 
insert into #table2 values (1, 'name_1', 'email_1') 
insert into #table2 values (2, 'name_2', 'email_2') 
insert into #table2 values (3, 'name_3', 'email_3') 
insert into #table2 values (4, 'name_4', 'email_4') 

print 'before update' 
select * from #table2 

print 'updating' 
update #table2 
set #table2.fname = t1.fname 
from #table1 t1 
where t1.email = #table2.email 

print 'insert missing' 
insert into #table2 
select * from #table1 
where #table1.email not in (select email from #table2 where email = #table1.email) 

print 'after update' 
select * from #table2 

drop table #table1 
drop table #table2 

ROLLBACK 
+0

Xin chào, cảm ơn vì đã dành thời gian để viết câu hỏi trên. Nhiều đánh giá cao ... Tôi sẽ cung cấp cho một thử. – doubleplusgood

+0

Điều này nếu cho bất kỳ ai sử dụng pre SQL 2008, vì lệnh MERGE chỉ được hỗ trợ trong SQL 2008. Họ đã lấy nó ra khỏi bản phát hành RTM. Nhóm SQL ngớ ngẩn. – invert