MySQLでは、構文を使用できます
DELETE t1,t2
FROM table1 AS t1
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...
SQL Serverで同じことをするにはどうすればよいですか?
MySQLでは、構文を使用できます
DELETE t1,t2
FROM table1 AS t1
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...
SQL Serverで同じことをするにはどうすればよいですか?
回答:
この例では、「削除された」疑似テーブルを利用できます。何かのようなもの:
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;
もちろん、「削除された出力」を実行できます。3番目のテーブルに結合する何かが必要な場合は、2番目の削除でも同様です。
ちなみに、insertステートメントでInserted。*を実行し、UpdateステートメントでInserted。*とDeleted。*を実行することもできます。
編集: また、table2 + 3から削除するトリガーをtable1に追加することを検討しましたか?暗黙のトランザクション内にいることになり、「挿入された」および「削除された」疑似テーブルも使用可能になります。
テーブルの関係にカスケード削除をいつでも設定できます。
複数の削除を1つのストアドプロシージャにカプセル化できます。
トランザクションを使用して、1つの作業単位を確保できます。
SQL ServerのDELETEのFROM句でJOIN構文を使用できますが、それでも最初のテーブルからのみ削除できます。これは、サブクエリに代わる独自のTransact-SQL拡張機能です。
-- 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;
マスターテーブルからいくつかのレコードを削除し、2つの詳細テーブルから対応するレコードを削除する例:
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
代わりにCREATE TABLE 'DeleteIds
続きますかINSERT INTO 'DeleteIds...
?
MySQLでそれが本当に可能ですか?それはt1とt2を削除しますか?または私は質問を誤解しました。
ただし、複数の結合条件を持つtable1を削除するだけの場合は、削除するテーブルにエイリアスを設定しないでください。
この:
DELETE t1,t2
FROM table1 AS t1
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...
MSSQLで機能するには、次のように記述します。
DELETE table1
FROM table1
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...
他の2つの一般的なRDBMSがどのように削除操作を行うかを対比してください。
http://mssql-to-postgresql.blogspot.com/2007/12/deleting-duplicates-in-postgresql-ms.html
基本的に、トランザクションで3つの削除ステートメントを作成する必要はありません。最初に子、次に親です。カスケード削除の設定は、これが1回限りのものではなく、その存在が既存のトリガー設定と競合しない場合に適しています。
これは、孤立したファイルを残さずにレコードを削除する別の方法です。
@user Table(keyValue int、someString varchar(10))を宣言します @userに挿入 値(1、 '1値') @userに挿入 値(2、 '2値') @userに挿入 値(3、 '3値') @password Table(keyValue int、詳細varchar(10))を宣言します @passwordに挿入 値(1、 '1パスワード') @passwordに挿入 値(2、 '2パスワード') @passwordに挿入 値(3、 '3パスワード') -削除前 @passwordから*を選択します。内部結合@user b on a.keyvalue = b.keyvalue select * into @deletedID from @user where keyvalue = 1-これは出力例のように機能します keyvalue = 1の@userを削除 キー値が含まれている@passwordを削除します(#deletedidからキー値を選択します) -削除後- @passwordから*を選択します。内部結合@user b on a.keyvalue = b.keyvalue
すべて指摘されています。ただ、いずれかを使用しDELETE ON CASCADE
、親にtable
またはから削除child-table
しますparent
。
John Gibbの答えに基づいて、FK関係を持つ2つのテーブルのデータセットを削除するには、次のようにします。
--*** 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 = "FROM DELETE basic_tbl
、education_tbl
、
personal_tbl
、address_tbl
、department_tbl
使用した
basic_tbl
、education_tbl
、
personal_tbl
、address_tbl
、= = = = = '" $番号。。 "」「; $ rs = mysqli_query($ con、$ sql);department_tbl
b_id
e_id
p_id
a_id
d_id