Saya ingin menghapus menggunakan INNER JOIN
di SQL Server 2008 .
Tapi saya mendapatkan kesalahan ini:
Msg 156, Level 15, Negara Bagian 1, Jalur 15
Sintaksis salah di dekat kata kunci 'INNER'.
Kode saya:
DELETE FROM WorkRecord2
INNER JOIN Employee ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
Anda perlu menentukan tabel apa yang Anda hapus, berikut adalah versi dengan alias:
DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
Cukup tambahkan nama tabel antara DELETE
dan FROM
dari tempat Anda ingin menghapus catatan karena kami harus menentukan tabel yang akan dihapus. Hapus juga klausa ORDER BY
karena tidak ada yang dipesan saat menghapus catatan.
Jadi permintaan akhir Anda harus seperti ini:
DELETE WorkRecord2
FROM WorkRecord2
INNER JOIN Employee
ON EmployeeRun=EmployeeNo
WHERE Company = '1'
AND Date = '2013-05-06';
Coba ini:
DELETE FROM WorkRecord2
FROM Employee
Where EmployeeRun=EmployeeNo
And Company = '1'
AND Date = '2013-05-06'
Mungkin ini bisa membantu Anda -
DELETE FROM dbo.WorkRecord2
WHERE EmployeeRun IN (
SELECT e.EmployeeNo
FROM dbo.Employee e
WHERE ...
)
Atau coba ini -
DELETE FROM dbo.WorkRecord2
WHERE EXISTS(
SELECT 1
FROM dbo.Employee e
WHERE EmployeeRun = e.EmployeeNo
AND ....
)
Harus:
DELETE zpost
FROM zpost
INNER JOIN zcomment ON (zpost.zpostid = zcomment.zpostid)
WHERE zcomment.icomment = "first"
Versi ini seharusnya berfungsi
DELETE WorkRecord2
FROM WorkRecord2
INNER JOIN Employee ON EmployeeRun=EmployeeNo
Where Company = '1' AND Date = '2013-05-06'
Coba kueri ini:
DELETE WorkRecord2, Employee
FROM WorkRecord2
INNER JOIN Employee ON (tbl_name.EmployeeRun=tbl_name.EmployeeNo)
WHERE tbl_name.Company = '1'
AND tbl_name.Date = '2013-05-06';
Di SQL Server Management Studio saya dapat dengan mudah membuat kueri SELECT.
SELECT Contact.Naam_Contactpersoon, Bedrijf.BedrijfsNaam, Bedrijf.Adres, Bedrijf.Postcode
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
Saya dapat menjalankannya, dan semua kontak saya ditampilkan.
Sekarang ubah SELECT menjadi DELETE:
DELETE Contact
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
Semua catatan yang Anda lihat dalam pernyataan SELECT akan dihapus.
Anda bahkan dapat membuat gabungan batin yang lebih sulit dengan prosedur yang sama, misalnya:
DELETE FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
INNER JOIN LoginBedrijf ON Bedrijf.IDLoginBedrijf = LoginBedrijf.IDLoginBedrijf
DELETE a FROM WorkRecord2 a
INNER JOIN Employee b
ON a.EmployeeRun = b.EmployeeNo
Where a.Company = '1'
AND a.Date = '2013-05-06'
Coba ini, ini mungkin bisa membantu
DELETE WorkRecord2
FROM WorkRecord2
INNER JOIN Employee
ON EmployeeRun=EmployeeNo
WHERE Company = '1'
AND Date = '2013-05-06';
Cara lain menggunakan CTE
.
;WITH cte
AS (SELECT *
FROM workrecord2 w
WHERE EXISTS (SELECT 1
FROM employee e
WHERE employeerun = employeeno
AND company = '1'
AND date = '2013-05-06'))
DELETE FROM cte
Catatan: Kami tidak dapat menggunakan JOIN
di dalam CTE
saat Anda ingin delete
.
Ini adalah permintaan sederhana untuk menghapus catatan dari dua tabel sekaligus.
DELETE table1.* ,
table2.*
FROM table1
INNER JOIN table2 ON table1.id= table2.id where table1.id ='given_id'
Anda tidak menentukan tabel untuk Company
dan Date
, Anda mungkin ingin memperbaikinya.
SQL standar menggunakan MERGE
:
MERGE WorkRecord2 T
USING Employee S
ON T.EmployeeRun = S.EmployeeNo
AND Company = '1'
AND Date = '2013-05-06'
WHEN MATCHED THEN DELETE;
Jawaban dari @Devart juga merupakan SQL Standar meskipun tidak lengkap, akan terlihat lebih seperti ini:
DELETE
FROM WorkRecord2
WHERE EXISTS ( SELECT *
FROM Employee S
WHERE S.EmployeeNo = WorkRecord2.EmployeeRun
AND Company = '1'
AND Date = '2013-05-06' );
Hal penting yang perlu diperhatikan tentang hal di atas adalah jelas bahwa penghapusan menargetkan satu tabel, seperti yang diberlakukan pada contoh kedua dengan memerlukan subquery skalar.
Bagi saya berbagai jawaban sintaksis kepemilikan lebih sulit untuk dibaca dan dipahami. Saya kira pola pikir untuk yang terbaik dijelaskan dalam jawaban oleh @frans eilering yaitu orang yang menulis kode tidak selalu peduli dengan orang yang akan membaca dan memelihara kode.
Ini adalah versi SQL Server saya
DECLARE @ProfileId table(Id bigint)
DELETE FROM AspNetUsers
OUTPUT deleted.ProfileId INTO @ProfileId
WHERE Email = @email
DELETE FROM UserProfiles
WHERE Id = (Select Id FROM @ProfileId)
Inilah yang saat ini saya gunakan untuk menghapus atau bahkan memperbarui:
DELETE FROM w
FROM WorkRecord2 w,
Employee e
WHERE w.EmployeeRun = e.EmployeeNo
AND w.Company = '1'
AND w.Date = '2013-05-06'