Mam dwie tabele z taką samą liczbą kolumn bez kluczy podstawowych (wiem, to nie moja wina). Teraz muszę usunąć wszystkie wiersze z tabeli A, które istnieją w tabeli B (są równe, każda z 30 kolumnami).DELETE WITH INTERSECT
Najbardziej natychmiastowy sposób, w jaki myślałem, to zrobić INNER JOIN
i rozwiązać mój problem. Ale warunki zapisu dla wszystkich kolumn (martwienie się o NULL
) nie jest eleganckie (może dlatego, że moje stoły też nie są eleganckie).
Chcę użyć INTERSECT
. Nie wiem, jak to zrobić? To jest moje pierwsze pytanie:
próbowałem (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
Ale wszystkie wiersze zostały usunięte z tabeli @A
.
To doprowadziło mnie do drugiego pytania: dlaczego polecenie DELETE @A FROM @B
usuwa wszystkie wiersze z tabeli @A
?
jeśli pamiętam dobrze, robi usunąć z B niczego nie ogranicza, i to normalne, że usuwa wszystko. można ograniczyć, wykonując coś takiego: USUŃ A Z B, gdzie A. wartość = B. Wartość Dodanie FROM po usunięciu jest podobne do LEWEGO DOŁĄCZENIA – Xavier
Miałeś na myśli 'DELETE A', a to nie działa. Właśnie usuwasz @ CROSS JOIN (coś innego). Który usuwa wszystko, jeśli jest co najmniej jeden wiersz w czymś innym. Spójrz na plan zapytania, aby to zobaczyć. – usr