2012-03-17 39 views
6

Tôi có hai bảng SQL Server giống nhau (SOURCEDESTINATION) với nhiều cột trong mỗi bảng. Tôi muốn chèn vào bảng DESTINATION hàng từ bảng SOURCE mà không tồn tại trong bảng DESTINATION. Tôi xác định sự bình đẳng giữa hai hàng nếu tất cả các cột phù hợp ngoại trừ dấu thời gian, cột đếm và khóa chính nguyên. Vì vậy, tôi muốn chèn vào DESTINATION tất cả các hàng trong SOURCE không tồn tại trong DESTINATION bỏ qua số lượng, dấu thời gian và các cột khóa chính.hợp nhất nội dung của hai bảng không trùng lặp nội dung

Làm cách nào để thực hiện việc này?

Cảm ơn tất cả những đóng góp! Tôi đã chọn sử dụng lệnh Merge vì nó được cấu trúc để cho phép cập nhật và chèn vào một câu lệnh và tôi cần thực hiện cập nhật riêng biệt.

này là mã mà làm việc:

Merge 
into DESTINATION as D 
using SOURCE as S 
on ( 
D.Col1 = S.Col1 
and D.Col2 = S.Col2 
and D.Col3 = S.Col3 
) 
WHEN MATCHED 
THEN UPDATE SET D.Count = S.Count 
WHEN NOT MATCHED THEN 
     INSERT (Col1, Col2, Col3, Count, timestamp) 
     VALUES (S.Col1, S.Col2, S.Col3, S.Count, S.timestamp); 

lưu ý: khi tôi viết câu hỏi này đầu tiên tôi gọi là bảng AAABBB. Tôi chỉnh sửa và thay đổi tên của AAA để SOURCEBBB để DESTINATION cho rõ ràng

Trả lời

5

sử dụng Select tuyên bố cho mục đích này kể từ Sql Server 2008 là lỗi thời, thay vì Select Bạn có thể sử dụng Merge tuyên bố:

ref:

http://technet.microsoft.com/en-us/library/bb510625.aspx http://weblogs.sqlteam.com/peterl/archive/2007/09/20/Example-of-MERGE-in-SQL-Server-2008.aspx

+1

Trường hợp sử dụng tuyệt vời cho lệnh MERGE. –

+0

Câu trả lời hay! Tôi đã không nhận thức được MERGE, nhưng tôi vẫn đang sử dụng năm 2005 (trong một vài tuần nữa), tôi chắc chắn sẽ sử dụng nó trong tương lai. – richardtallent

+0

Tôi đang cố gắng tìm ra cách sử dụng nó. ví dụ trong tài liệu yêu cầu bạn xem qua các phần tử trong bảng AAA. Tôi nghĩ rằng việc sử dụng quyền chọn nên tránh điều đó. – Barka

5

Something như thế này:

INSERT INTO BBB(id, timestamp, mycount, col1, col2, col3, etc.) 
SELECT id, timestamp, mycount, col1, col2, col3, etc. 
    FROM AAA 
    WHERE 
     NOT EXISTS(SELECT NULL FROM BBB oldb WHERE 
      oldb.col1 = AAA.col1 
      AND oldb.col2 = AAA.col2 
      AND oldb.col3 = AAA.col3 
     ) 

Thêm cột khi cần thiết để các khoản NOT EXISTS.

1

Một giải pháp sử dụng tốt ol' lỗi thời LEFT JOIN - lưu ý trong ví dụ dưới đây, chỉ có hàng đầu tiên của BBB được chèn vào AAA, bởi vì chỉ có nó không có hàng phù hợp trong AAA. Bạn sẽ thay thế col1col2 bằng các cột thực tế của bảng.

> select * from AAA; 
+---------------------+------+------+ 
| timestamp   | col1 | col2 | 
+---------------------+------+------+ 
| 2012-03-17 08:17:22 | 1 | 1 | 
| 2012-03-17 08:17:27 | 1 | 2 | 
| 2012-03-17 08:17:30 | 1 | 3 | 
| 2012-03-17 08:17:32 | 1 | 4 | 
| 2012-03-17 08:17:49 | 2 | 2 | 
| 2012-03-17 08:17:52 | 2 | 3 | 
| 2012-03-17 08:17:54 | 2 | 4 | 
+---------------------+------+------+ 
7 rows in set (0.00 sec) 

> select * from BBB; 
+---------------------+------+------+ 
| timestamp   | col1 | col2 | 
+---------------------+------+------+ 
| 2012-03-17 08:18:16 | 2 | 1 | 
| 2012-03-17 08:18:18 | 2 | 2 | 
| 2012-03-17 08:18:20 | 2 | 3 | 
+---------------------+------+------+ 
3 rows in set (0.00 sec) 

> INSERT INTO AAA 
    SELECT BBB.* FROM BBB 
    LEFT JOIN AAA 
    USING(col1,col2) 
    WHERE AAA.timestamp IS NULL; 

> select * from AAA; 
+---------------------+------+------+ 
| timestamp   | col1 | col2 | 
+---------------------+------+------+ 
| 2012-03-17 08:17:22 | 1 | 1 | 
| 2012-03-17 08:17:27 | 1 | 2 | 
| 2012-03-17 08:17:30 | 1 | 3 | 
| 2012-03-17 08:17:32 | 1 | 4 | 
| 2012-03-17 08:17:49 | 2 | 2 | 
| 2012-03-17 08:17:52 | 2 | 3 | 
| 2012-03-17 08:17:54 | 2 | 4 | 
| 2012-03-17 08:18:16 | 2 | 1 | 
+---------------------+------+------+ 
8 rows in set (0.00 sec) 
+0

USING() không được hỗ trợ trong MSSQL. IIRC, đó là một tính năng của MySQL. Nhưng tôi thích phương pháp nối của bạn, cú pháp ít chi tiết hơn nhưng sạch hơn so với truy vấn con tương quan. – richardtallent

+0

@richardtallent bạn có thể sử dụng ON() thay vì SỬ DỤNG() trong MSSQL không? – gcbenison

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