Tôi có hai bảng sau:Tránh các bản sao ở INSERT INTO truy vấn SELECT trong SQL Server
Table1
----------
ID Name
1 A
2 B
3 C
Table2
----------
ID Name
1 Z
tôi cần phải chèn dữ liệu từ Table1
để Table2
. Tôi có thể sử dụng cú pháp sau:
INSERT INTO Table2(Id, Name) SELECT Id, Name FROM Table1
Tuy nhiên, trong trường hợp của tôi, ID trùng lặp có thể tồn tại trong Table2
(trong trường hợp của tôi, nó chỉ là "1
") và tôi không muốn sao chép đó một lần nữa như rằng sẽ ném một lỗi.
tôi có thể viết một cái gì đó như thế này:
IF NOT EXISTS(SELECT 1 FROM Table2 WHERE Id=1)
INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1
ELSE
INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1 WHERE Table1.Id<>1
Có cách nào tốt hơn để làm điều này mà không sử dụng IF - ELSE
? Tôi muốn tránh hai tuyên bố INSERT INTO-SELECT
dựa trên một số điều kiện.
Ju st một làm rõ trên phiên bản không tồn tại, bạn sẽ cần một WITH (HOLDLOCK) gợi ý hoặc không có khóa sẽ được thực hiện (vì không có hàng để khóa!) để một luồng khác có thể chèn hàng dưới bạn. – IDisposable
Thú vị, bởi vì tôi luôn tin rằng tham gia nhanh hơn các lựa chọn phụ. Có lẽ đó là cho chỉ tham gia thẳng, và không áp dụng cho tham gia trái. – Duncan
Duncan, việc tham gia thường nhanh hơn khi bỏ chọn khi chúng là các truy vấn con tương quan. Nếu bạn có truy vấn phụ trong danh sách lựa chọn, thì việc nối sẽ thường nhanh hơn. – HLGEM