Di MySQL Anda dapat menggunakan sintaks
DELETE t1,t2
FROM table1 AS t1
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...
Bagaimana cara melakukan hal yang sama di SQL Server?
Di MySQL Anda dapat menggunakan sintaks
DELETE t1,t2
FROM table1 AS t1
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...
Bagaimana cara melakukan hal yang sama di SQL Server?
Jawaban:
Anda dapat memanfaatkan tabel semu yang "dihapus" dalam contoh ini. Sesuatu seperti:
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;
Jelas Anda bisa melakukan 'keluaran dihapus.' pada hapus kedua juga, jika Anda membutuhkan sesuatu untuk digabungkan untuk tabel ketiga.
Sebagai catatan tambahan, Anda juga dapat melakukan penyisipan. * Pada pernyataan penyisipan, dan keduanya disisipkan. * Dan dihapus. * Pada pernyataan pembaruan.
EDIT: Juga, apakah Anda mempertimbangkan untuk menambahkan pemicu pada table1 untuk menghapus dari table2 + 3? Anda akan berada di dalam transaksi implisit, dan juga akan mendapatkan pseudo-tabel "dimasukkan " dan "dihapus ".
Anda selalu bisa menyiapkan penghapusan berjenjang pada hubungan tabel.
Anda dapat merangkum beberapa penghapusan dalam satu prosedur yang tersimpan.
Anda dapat menggunakan transaksi untuk memastikan satu unit kerja.
Anda dapat menggunakan sintaks JOIN di klausa FROM di DELETE di SQL Server tetapi Anda masih menghapus dari tabel pertama saja dan ekstensi Transact-SQL miliknya yang merupakan alternatif untuk sub-kueri.
Dari contoh di sini :
-- 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;
Contoh untuk menghapus beberapa rekaman dari tabel master dan rekaman terkait dari dua tabel detail:
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
alih-alih CREATE TABLE 'DeleteIds
diikuti oleh INSERT INTO 'DeleteIds...
?
Hanya ingin tahu .. apakah itu mungkin di MySQL? itu akan menghapus t1 dan t2? atau saya hanya salah memahami pertanyaan itu.
Tetapi jika Anda hanya ingin menghapus tabel1 dengan beberapa kondisi penggabungan, jangan alias tabel yang ingin Anda hapus
ini:
DELETE t1,t2
FROM table1 AS t1
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...
harus ditulis seperti ini untuk bekerja di MSSQL:
DELETE table1
FROM table1
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...
untuk membedakan bagaimana dua RDBMS umum lainnya melakukan operasi penghapusan:
http://mssql-to-postgresql.blogspot.com/2007/12/deleting-duplicates-in-postgresql-ms.html
Pada dasarnya, tidak, Anda harus membuat tiga pernyataan hapus dalam transaksi, anak-anak terlebih dahulu dan kemudian orang tua. Menyiapkan cascading delete adalah ide yang bagus jika ini bukan hal yang hanya terjadi satu kali dan keberadaannya tidak akan bertentangan dengan pengaturan pemicu yang ada.
Ini adalah cara alternatif untuk menghapus catatan tanpa meninggalkan yatim piatu.
Deklarasikan Tabel @user (keyValue int, someString varchar (10)) masukkan ke @user nilai (1, '1 nilai') masukkan ke @user nilai (2, '2 nilai') masukkan ke @user nilai (3, '3 nilai') Deklarasikan Tabel @password (keyValue int, details varchar (10)) masukkan ke @password nilai (1, '1 Password') masukkan ke @password nilai (2, '2 Password') masukkan ke @password nilai (3, '3 Kata Sandi') --sebelum penghapusan pilih * dari @password a inner join @user b di a.keyvalue = b.keyvalue pilih * ke #deletedID dari @user di mana keyvalue = 1 - ini berfungsi seperti contoh keluaran hapus @user dimana keyvalue = 1 hapus @ kata sandi di mana nilai kunci masuk (pilih nilai kunci dari #deletedid) --Setelah penghapusan-- pilih * dari @password a inner join @user b di a.keyvalue = b.keyvalue
Semua telah ditunjukkan. Cukup gunakan salah satu DELETE ON CASCADE
dari induknya table
atau hapus dari child-table
ke parent
.
Seperti yang telah ditunjukkan oleh Aaron, Anda dapat mengatur perilaku delete ke CASCADE dan itu akan menghapus rekaman anak ketika rekaman induk dihapus. Kecuali jika Anda ingin keajaiban lain terjadi (dalam hal ini poin 2, 3 dari balasan Aaron akan berguna), saya tidak mengerti mengapa Anda perlu menghapus dengan gabungan dalam.
Untuk mengembangkan jawaban John Gibb, untuk menghapus sekumpulan data dalam dua tabel dengan hubungan 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
MENGGUNAKAN
basic_tbl
, education_tbl
,
personal_tbl
, address_tbl
, department_tbl
MANA
b_id
= e_id
= p_id
= a_id
= d_id
= '" $ id.. "' "; $ rs = mysqli_query ($ con, $ sql);