2012-02-15 38 views
5

Vì vậy, tôi có bảng temp này có cấu trúc như:SQL chèn vào sử dụng Liên minh nên thêm chỉ giá trị khác biệt

col1 col2 col3 col3 
intID1 intID2 intID3 bitAdd 

Tôi đang làm một liên minh của các giá trị của bảng temp này với một truy vấn chọn và lưu trữ nó vào bảng temp cùng một điều. Điều này là col3 không phải là một phần của truy vấn công đoàn tôi sẽ cần nó sau này để cập nhật bảng.

Vì vậy, tôi đang làm như vậy:

Insert into #temptable 
(
intID1, 
intID2, 
intID3 
) 
select intID1,intID2,intID3 
From 
#temptable 

UNION 

select intID1,intID2,intID3 
From 
Table A 

Issue là tôi muốn chỉ có các hàng mà không phải là đã tồn tại trong bảng tạm thời được added.Doing nó theo cách này sẽ bổ sung thêm một bản sao của đã hàng hiện tại (vì union sẽ trả về một hàng) Làm cách nào để chèn chỉ những hàng không tồn tại trong bảng tạm thời hiện tại trong truy vấn union?

Trả lời

7

Nice và đơn giản với EXCEPT

INSERT INTO #temptable (intID1, intID2, intID3) 
SELECT intID1,intID2,intID3 FROM TableA 
EXCEPT 
SELECT intID1,intID2,intID3 FROM #temptable 
+0

cảm ơn bạn đã làm việc rất tốt! – user1212140

9

Sử dụng MERGE:

MERGE INTO #temptable tmp 
USING (select intID1,intID2,intID3 From Table A) t 
ON (tmp.intID1 = t.intID1 and tmp.intID2 = t.intID2 and tmp.intID3 = t.intID3) 
WHEN NOT MATCHED THEN 
INSERT (intID1,intID2,intID3) 
VALUES (t.intID1,t.intID2,t.intID3) 
+0

cảm ơn câu trả lời của bạn, tuy nhiên máy chủ sql phiên bản mà chúng tôi sử dụng là 2005. Tôi không thể sử dụng từ khóa đó. – user1212140

0

tôi nhìn thấy nơi bạn đang đến từ. Trong hầu hết các ngôn ngữ lập trình #temptable sẽ là một biến (một biến liên quan hoặc relvar viết tắt) mà bạn sẽ gán một giá trị (giá trị liên quan) như sau:

#temptable := #temptable UNION A 

Trong mô hình quan hệ, điều này sẽ đạt được kết quả mong muốn vì một quan hệ không có các hàng trùng lặp theo định nghĩa.

Tuy nhiên, SQL không thực sự quan hệ và không hỗ trợ gán. Thay vào đó, bạn được yêu cầu thêm các hàng vào một bảng bằng cách sử dụng câu lệnh SQL DML INSERT (không quá tệ: người dùng của một ngôn ngữ cơ sở dữ liệu quan hệ thực sự, nếu chúng ta có một ngôn ngữ, sẽ không nghi ngờ gì nữa. bạn cũng được yêu cầu tự làm thử nghiệm cho bản sao.

Câu trả lời từ Daniel Hilgarth và Joachim Isaksson đều tốt. Thực hành tốt để có hai câu trả lời tốt, hợp lý, sau đó tìm tiêu chí (thường là hiệu suất theo tải điển hình) để loại bỏ một (nhưng vẫn giữ lại nhận xét để kiểm tra lại trong tương lai!)

+0

Cảm ơn sự thật! – user1212140

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