W MySQL możesz użyć składni
DELETE t1,t2
FROM table1 AS t1
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...
Jak zrobić to samo w SQL Server?
W MySQL możesz użyć składni
DELETE t1,t2
FROM table1 AS t1
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...
Jak zrobić to samo w SQL Server?
Odpowiedzi:
W tym przykładzie możesz wykorzystać pseudo tabelę „usuniętą”. Coś jak:
begin transaction;
declare @deletedIds table ( id int );
delete from t1
output deleted.id into @deletedIds
from table1 as t1
inner join table2 as t2
on t2.id = t1.id
inner join table3 as t3
on t3.id = t2.id;
delete from t2
from table2 as t2
inner join @deletedIds as d
on d.id = t2.id;
delete from t3
from table3 as t3 ...
commit transaction;
Oczywiście możesz zrobić „wyjście usunięte”. przy drugim również usuń, jeśli potrzebujesz czegoś do przyłączenia się przy trzecim stole.
Na marginesie, można również wstawić. * W instrukcji wstawiania oraz wstawiać. * I usuwać. * W instrukcji aktualizacji.
EDYCJA: Czy rozważałeś również dodanie wyzwalacza w tabeli 1 w celu usunięcia z tabeli 2 + 3? Będziesz wewnątrz niejawnej transakcji i będziesz mieć również dostępne pseudo-tabele „wstawione ” i „usunięte ”.
Zawsze możesz skonfigurować usuwanie kaskadowe w relacjach tabel.
Możesz hermetyzować wiele usunięć w jednej procedurze składowanej.
Możesz użyć transakcji, aby zapewnić jedną jednostkę pracy.
Możesz użyć składni JOIN w klauzuli FROM w DELETE w SQL Server, ale nadal usuwasz tylko z pierwszej tabeli i jest to zastrzeżone rozszerzenie Transact-SQL, które jest alternatywą dla zapytania podrzędnego.
Z przykładu tutaj :
-- Transact-SQL extension
DELETE
FROM Sales.SalesPersonQuotaHistory
FROM Sales.SalesPersonQuotaHistory AS spqh INNER JOIN
Sales.SalesPerson AS sp ON spqh.BusinessEntityID = sp.BusinessEntityID
WHERE sp.SalesYTD > 2500000.00;
Przykład usunięcia niektórych rekordów z tabeli głównej i odpowiednich rekordów z dwóch tabel szczegółowych:
BEGIN TRAN
-- create temporary table for deleted IDs
CREATE TABLE #DeleteIds (
Id INT NOT NULL PRIMARY KEY
)
-- save IDs of master table records (you want to delete) to temporary table
INSERT INTO #DeleteIds(Id)
SELECT DISTINCT mt.MasterTableId
FROM MasterTable mt
INNER JOIN ...
WHERE ...
-- delete from first detail table using join syntax
DELETE d
FROM DetailTable_1 D
INNER JOIN #DeleteIds X
ON D.MasterTableId = X.Id
-- delete from second detail table using IN clause
DELETE FROM DetailTable_2
WHERE MasterTableId IN (
SELECT X.Id
FROM #DeleteIds X
)
-- and finally delete from master table
DELETE d
FROM MasterTable D
INNER JOIN #DeleteIds X
ON D.MasterTableId = X.Id
-- do not forget to drop the temp table
DROP TABLE #DeleteIds
COMMIT
SELECT INTO #DeleteIds
zamiast CREATE TABLE 'DeleteIds
po INSERT INTO 'DeleteIds...
?
Zastanawiam się tylko… czy to naprawdę możliwe w MySQL? usunie t1 i t2? albo po prostu źle zrozumiałem pytanie.
Ale jeśli chcesz tylko usunąć tabelę table1 z wieloma warunkami łączenia, po prostu nie aliasuj tabeli, którą chcesz usunąć
to:
DELETE t1,t2
FROM table1 AS t1
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...
powinno być napisane w ten sposób, aby działało w MSSQL:
DELETE table1
FROM table1
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...
aby porównać, w jaki sposób dwa inne popularne RDBMS wykonują operację usuwania:
http://mssql-to-postgresql.blogspot.com/2007/12/deleting-duplicates-in-postgresql-ms.html
Zasadniczo nie, musisz zrobić trzy oświadczenia o usunięciu w transakcji, najpierw dzieci, a potem rodzice. Konfiguracja usuwania kaskadowego jest dobrym pomysłem, jeśli nie jest to jednorazowa rzecz, a jej istnienie nie będzie kolidować z żadną istniejącą konfiguracją wyzwalacza.
Jest to alternatywny sposób usuwania rekordów bez pozostawiania sierot.
Zadeklaruj tabelę @user (keyValue int, someString varchar (10)) wstaw do @user wartości (1, „1 wartość”) wstaw do @user wartości (2, „2 wartość”) wstaw do @user wartości (3, „3 wartość”) Zadeklaruj @password Table (keyValue int, details varchar (10)) wstaw do @password wartości (1, „1 hasło”) wstaw do @password wartości (2, „2 Hasło”) wstaw do @password wartości (3, „3 Hasło”) - przed usunięciem wybierz * z @password złączenie wewnętrzne @user b na a.keyvalue = b.keyvalue select * do #deletedID z @user, gdzie keyvalue = 1 - działa to jak w przykładzie wyjściowym usuń @user, gdzie keyvalue = 1 usuń @password, gdzie keyvalue w (wybierz wartość klucza z #deletedid) --Po usunięciu-- wybierz * z @password złączenie wewnętrzne @user b na a.keyvalue = b.keyvalue
Wszystko zostało wskazane. Po prostu użyj DELETE ON CASCADE
na rodzicu table
lub usuń z child-table
do parent
.
Jak już wskazał Aaron, możesz ustawić zachowanie usuwania na CASCADE, co spowoduje usunięcie rekordów podrzędnych, gdy rekord nadrzędny zostanie usunięty. O ile nie chcesz, aby wydarzyła się jakaś inna magia (w takim przypadku przydatne byłyby punkty 2 i 3 odpowiedzi Aarona), nie rozumiem, dlaczego miałbyś usuwać za pomocą złączeń wewnętrznych.
Aby oprzeć się na odpowiedzi Johna Gibba, aby usunąć zestaw danych w dwóch tabelach z relacją FK:
--*** To delete from tblMain which JOINs to (has a FK of) tblReferredTo's PK
-- i.e. ON tblMain.Refer_FK = tblReferredTo.ID
--*** !!! If you're CERTAIN that no other rows anywhere also refer to the
-- specific rows in tblReferredTo !!!
BEGIN TRAN;
--*** Keep the ID's from tblReferredTo when we DELETE from tblMain
DECLARE @tblDeletedRefs TABLE ( ID INT );
--*** DELETE from the referring table first
DELETE FROM tblMain
OUTPUT DELETED.Refer_FK INTO @tblDeletedRefs -- doesn't matter that this isn't DISTINCT, the following DELETE still works.
WHERE ..... -- be careful if filtering, what if other rows
-- in tblMain (or elsewhere) also point to the tblReferredTo rows?
--*** Now we can remove the referred to rows, even though tblMain no longer refers to them.
DELETE tblReferredTo
FROM tblReferredTo INNER JOIN @tblDeletedRefs Removed
ON tblReferredTo.ID = Removed.ID;
COMMIT TRAN;
DELETE TABLE1 LIN
FROM TABLE1 LIN
INNER JOIN TABLE2 LCS ON CONDITION
WHERE CONDITION
$ sql = "DELETE FROM basic_tbl
, education_tbl
,
personal_tbl
, address_tbl
, department_tbl
UŻYWANIE
basic_tbl
, education_tbl
,
personal_tbl
, address_tbl
, department_tbl
GDZIE
b_id
= e_id
= p_id
= a_id
= d_id
="" $ id.."”„; $ rs = mysqli_query ($ con, $ sql);