Tôi có hai bảng có cùng số cột không có khóa chính (tôi biết, đây không phải lỗi của tôi). Bây giờ tôi cần phải xóa tất cả các hàng từ bảng A tồn tại trong bảng B (chúng bằng nhau, mỗi cột có 30 cột).DELETE WITH INTERSECT
Cách trực tiếp nhất mà tôi nghĩ là thực hiện INNER JOIN
và giải quyết sự cố của mình. Tuy nhiên, viết điều kiện cho tất cả các cột (đáng lo ngại về NULL
) không phải là thanh lịch (có thể gây ra các bảng của tôi không thanh lịch hoặc).
Tôi muốn sử dụng INTERSECT
. Tôi không biết làm thế nào để làm điều đó? Đây là câu hỏi của tôi đầu tiên:
tôi đã cố gắng (SQL Fiddle):
declare @A table (value int, username varchar(20))
declare @B table (value int, username varchar(20))
insert into @A values (1, 'User 1'), (2, 'User 2'), (3, 'User 3'), (4, 'User 4')
insert into @B values (2, 'User 2'), (4, 'User 4'), (5, 'User 5')
DELETE @A
FROM (SELECT * FROM @A INTERSECT SELECT * from @B) A
Nhưng tất cả các hàng đã bị xóa từ bảng @A
.
Điều này dẫn tôi đến câu hỏi thứ hai: tại sao lệnh DELETE @A FROM @B
xóa tất cả các hàng khỏi bảng @A
?
Nếu tôi nhớ rõ, việc xóa B FROM B không hạn chế bất cứ điều gì và điều này bình thường sẽ xóa mọi thứ. bạn có thể hạn chế bằng cách thực hiện một cái gì đó như: XÓA A FROM B trong đó A.value = B.Value Thêm FROM sau khi xóa giống như LEFT JOIN – Xavier
Bạn có nghĩa là 'DELETE A' và không chạy. Ngay bây giờ bạn đang xóa @A CROSS JOIN (cái gì khác). Mà xóa tất cả mọi thứ nếu có ít nhất một hàng trong cái gì khác. Nhìn vào kế hoạch truy vấn để xem điều này. – usr