Scenariusz:
Powiedzmy, że mam dwie tabele, TableA i TableB. Klucz podstawowy tabeli B to pojedyncza kolumna (BId) i kolumna klucza obcego w tabeli A.
W mojej sytuacji chcę usunąć wszystkie wiersze w tabeli A, które są powiązane z określonymi wierszami w tabeli B: Czy mogę to zrobić za pomocą sprzężeń? Usunąć wszystkie wiersze wciągnięte ze złączeń?
DELETE FROM TableA
FROM
TableA a
INNER JOIN TableB b
ON b.BId = a.BId
AND [my filter condition]
Czy jestem zmuszony to zrobić:
DELETE FROM TableA
WHERE
BId IN (SELECT BId FROM TableB WHERE [my filter condition])
Powód, dla którego pytam, wydaje mi się, że pierwsza opcja byłaby o wiele bardziej skuteczna w przypadku większych tabel.
Dzięki!
DELETE TableA, TableB ...
które faktycznie usunęło odpowiednie rekordy z obu. Miły.DELETE from TableA a using TableB b where b.Bid = a.Bid and [my filter condition]
DELETE a FROM TableA a INNER JOIN TableB b on b.Bid = a.Bid and [my filter condition]
Użyłbym tej składni
źródło
Tak, możesz. Przykład:
źródło
Próbowałem to zrobić z bazą danych dostępu i stwierdziłem, że muszę użyć pliku. * Zaraz po usunięciu.
źródło
W MySQL jest prawie tak samo , ale musisz użyć aliasu tabeli zaraz po słowie „DELETE”:
źródło
Powyższa składnia nie działa w Interbase 2007. Zamiast tego musiałem użyć czegoś takiego:
(Uwaga: Interbase nie obsługuje słowa kluczowego AS dla aliasów)
źródło
Używam tego
a sposób @TheTXI jest wystarczający, ale czytam odpowiedzi i komentarze i znalazłem jedną rzecz, na którą należy odpowiedzieć, używając warunku w klauzuli WHERE lub jako warunku złączenia. Postanowiłem go przetestować i napisać fragment, ale nie znalazłem między nimi znaczącej różnicy. Tutaj możesz zobaczyć skrypt sql, a ważne jest to, że wolałem napisać go jako commnet, ponieważ nie jest to dokładna odpowiedź, ale jest duży i nie można go wstawić w komentarzach, proszę wybacz mi.
Jeśli możesz uzyskać dobry powód z tego skryptu lub napisać inny użyteczny, proszę udostępnij. Dzięki i mam nadzieję, że ta pomoc.
źródło
Załóżmy, że masz 2 tabele, jedną z zestawem głównym (np. Pracownicy) i jedną z zestawem podrzędnym (np. Osoby zależne) i chcesz pozbyć się wszystkich wierszy danych w tabeli osób zależnych, których nie można zapisać z dowolnymi wierszami w tabeli wzorcowej.
Należy tutaj zauważyć, że najpierw zbierasz „tablicę” EmpID od sprzężenia, używając tego zestawu EmpID do wykonania operacji usuwania w tabeli Dependents.
źródło
W SQLite jedyne, co działa, to coś podobnego do odpowiedzi beauXjames.
Wydaje się, że sprowadza się to do tego
DELETE FROM table1 WHERE table1.col1 IN (SOME TEMPORARY TABLE);
i że niektóre tabele tymczasowe mogą być tworzone przez SELECT i DOŁĄCZ twoją tabelę, którą możesz filtrować tę tabelę tymczasową na podstawie warunku, że chcesz usunąć rekordy z Tabeli 1.źródło
możesz uruchomić to zapytanie: -
źródło
Prostszym sposobem jest:
źródło
Minimalizuj użycie zapytań DML z łączeniami. Powinieneś być w stanie wykonać większość wszystkich zapytań DML z podkwerendami jak wyżej.
Zasadniczo złączeń należy używać tylko wtedy, gdy trzeba WYBRAĆ lub GRUPOWAĆ według kolumn w 2 lub więcej tabelach. Jeśli dotykasz tylko wielu tabel, aby zdefiniować populację, użyj podkwerend. W przypadku zapytań DELETE użyj skorelowanych podkwerend.
źródło