2010-02-18 75 views
14

Tôi đang tạo sproc rằng sẽ chèn hàng vào một bảng 'dàn' với một chèn vào + subquery như vậy:chèn có điều kiện sql nếu hàng không tồn tại

INSERT INTO myStagingTable 
SELECT col1, col2, col3 
FROM myRealTable 

tôi cần phải đặt một có điều kiện trong đó bằng cách nào đó để xác định nếu giá trị từ col1 ví dụ đã tồn tại trên myStagingTable, sau đó không chèn nó, chỉ cần bỏ qua hàng đó từ myRealTable.

là điều này có thể? Nếu vậy, tôi sẽ cấu trúc như thế nào?

TIA

Trả lời

16
INSERT 
INTO myStagingTable 
SELECT col1, col2, col3 
FROM myRealTable rt 
WHERE NOT EXISTS 
     (
     SELECT rt.col1, rt.col2, rt.col3 
     INTERSECT 
     SELECT col1, col2, col3 
     FROM myStagingTable 
     ) 

này sẽ xử lý tất cả các bản sao (kể cả NULL)

Lưu ý rằng là sẽ chèn các bản sao từ bảng thực sự là bất kỳ. Giả sử nếu bảng thực chứa

1 1 1 
1 1 1 

và bảng dàn chứa

2 2 2 

, cả hai hồ sơ với 1, 1, 1 sẽ được chèn vào.

Nếu bạn muốn loại bỏ các bản sao trên chèn (để chỉ một thể hiện của 1, 1, 1 được chèn), sau đó chỉ cần sử dụng này:

INSERT 
INTO myStagingTable 
SELECT col1, col2, col3 
FROM myRealTable 
EXCEPT 
SELECT col1, col2, col3 
FROM myStagingTable 
+0

Không nên bạn chỉ định các cột được lựa chọn trên cả hai mặt của INTSERSECT mệnh đề? Điều gì xảy ra nếu có bốn cols trong myRealTable? –

+0

@Philip: chắc chắn, vừa sửa lỗi này :) – Quassnoi

+0

Dường như INTERSECT và EXCEPT không được hỗ trợ trong SQL2000 ... – jiaoziren

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