Saya ingin menghapus menggunakan INNER JOIN
di SQL Server 2008.
Tapi saya mendapatkan error ini:
Msg 156, 15 Tingkat, Negara bagian 1, Baris 15 Salah sintaks dekat kata kunci 'DALAM'.
Kode saya:
DELETE FROM WorkRecord2
INNER JOIN Employee ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
Anda perlu menentukan apa meja anda menghapus dari, di sini adalah versi dengan alias:
DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
Hanya menambahkan nama tabel antara HAPUS
dan DARI
dari mana anda ingin menghapus catatan karena kita harus menentukan tabel yang akan dihapus. Juga menghapus ORDER BY
klausul karena tidak ada order saat menghapus catatan.
Jadi anda akhir query harus seperti ini:
DELETE WorkRecord2
FROM WorkRecord2
INNER JOIN Employee
ON EmployeeRun=EmployeeNo
WHERE Company = '1'
AND Date = '2013-05-06';
Mungkin ini akan bermanfaat bagi 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 ....
)
Di SQL Server Management Studio, saya dapat dengan mudah membuat sebuah PILIH
query.
SELECT Contact.Naam_Contactpersoon, Bedrijf.BedrijfsNaam, Bedrijf.Adres, Bedrijf.Postcode
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
Aku dapat melaksanakannya, dan semua kontak akan ditampilkan.
Sekarang mengubah MEMILIH
untuk DELETE
:
DELETE Contact
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
Semua catatan yang anda lihat di PILIH
pernyataan akan dihapus.
Anda bahkan dapat membuat lebih sulit inner join 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'
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 menggunakan BERGABUNG
dalam CTE
ketika anda ingin menghapus
.
Anda don't menentukan tabel untuk Perusahaan
dan Tanggal
, anda mungkin ingin memperbaiki itu.
Standar SQL menggunakan MENGGABUNGKAN
:
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 Standar SQL meskipun tidak lengkap, harus 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 harus diperhatikan tentang hal di atas jelas menghapus menargetkan satu tabel, seperti diberlakukan pada contoh kedua dengan mengharuskan scalar subquery.
Bagi saya berbagai proprietary sintaks jawaban yang sulit untuk membaca dan memahami. Saya kira pola pikir untuk lebih baik dijelaskan dalam jawaban oleh @frans eilering yaitu orang yang menulis kode doesn't perlu peduli tentang orang-orang yang akan membaca dan memelihara kode.
Berikut ini's apa yang saat ini saya gunakan untuk menghapus atau bahkan memperbaharui:
DELETE w
FROM WorkRecord2 w,
Employee e
WHERE w.EmployeeRun = e.EmployeeNo
AND w.Company = '1'
AND w.Date = '2013-05-06'