Bagaimana cara menghapus menggunakan INNER JOIN dengan SQL Server?

1283

Saya ingin menghapus menggunakan INNER JOINdi SQL Server 2008 .

Tapi saya mendapatkan kesalahan ini:

Msg 156, Level 15, Status 1, Baris 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'
nettoon493
sumber
2
Contoh C dalam dokumentasi menunjukkan cara menggunakan DELETEdengan bergabung
Pondlife
1
Contoh C juga menggunakan kursor dan banyak hal yang asing
reggaeguitar
Hapus dari table1 dari table1 t1 inner join table2 t2 di t1.id = t2.id; secara rinci youtu.be/_tyUVrS2iH4
Amresh Kumar Singh

Jawaban:

2241

Anda perlu menentukan tabel apa yang Anda hapus, ini adalah versi dengan alias:

DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
  ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
Taryn
sumber
9
@bluefeet dapatkah Anda memberikan sintaksis yang tepat untuk SQL Server untuk dihapus dari kedua tabel?
oabarca
44
@ user2070775 Dalam SQL Server untuk menghapus dari 2 tabel Anda harus menggunakan 2 pernyataan terpisah.
Taryn
8
@ user2070775 di SQL Server, Anda dapat menggunakan transaksi dan pseudo-tables, seperti yang ditunjukkan pada stackoverflow.com/questions/783726/…
Mathieu Rodic
1
@MathieuRodic terima kasih telah berbagi. Dalam pengaturan saya jika saya menghapus dari 2 tabel secara terpisah, saya tidak benar-benar tahu lagi baris mana yang harus dihapus dari tabel 2 jadi ini akan membantu :)
Verena Haunschmid
2
@ShahryarSaljoughi itu adalah alias untuk tabel WorkRecord2.
Taryn
151

Cukup tambahkan nama tabel di antara DELETEdan FROMdari tempat Anda ingin menghapus catatan karena kami harus menentukan tabel yang akan dihapus. Hapus juga ORDER BYklausa 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';
hims056
sumber
3
Yang ini bekerja pada SQL Server jika Anda hanya ingin menghapus dari tabel pertama.
TroySteven
1
@matwonk: Anda dapat menghapus dari tabel kedua hingga jika Anda menggunakan nama tabel kedua. Misalnya menggunakan DELETE Employeeakan menghapus dari tabel Karyawan bukan WorkRecord2tabel.
hims056
1
@matwonk: Ini contohnya: 1) Menghapus dari tabel pertama 2) Menghapus dari tabel kedua .
hims056
30

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 ....
)
Devart
sumber
1
Ini adalah satu-satunya jawaban yang berfungsi pada Sql Server. Cukup buat permintaan Anda seperti pilih Id dari ... gabung ... gabung dll lalu bungkus sebagai subquery dan lakukan delete dari (tabel) tempat Id in (subquery)
Chris Moschini
28

Coba ini:

DELETE FROM WorkRecord2 
       FROM Employee 
Where EmployeeRun=EmployeeNo
      And Company = '1' 
      AND Date = '2013-05-06'
Behrouz Bakhtiari
sumber
16

Harus:

DELETE zpost 
FROM zpost 
INNER JOIN zcomment ON (zpost.zpostid = zcomment.zpostid)
WHERE zcomment.icomment = "first"       
yoginder bagga
sumber
11

Versi ini seharusnya berfungsi

DELETE WorkRecord2
FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
Where Company = '1' AND Date = '2013-05-06'
AustinTX
sumber
11

Di SQL Server Management Studio saya dapat dengan mudah membuat SELECTkueri.

SELECT Contact.Naam_Contactpersoon, Bedrijf.BedrijfsNaam, Bedrijf.Adres, Bedrijf.Postcode
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf

Saya bisa menjalankannya, dan semua kontak saya ditampilkan.

Sekarang ubah SELECTke DELETE:

DELETE Contact
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf

Semua catatan yang Anda lihat dalam SELECTpernyataan 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
fil eilering
sumber
10
 DELETE a FROM WorkRecord2 a 
       INNER JOIN Employee b 
       ON a.EmployeeRun = b.EmployeeNo 
       Where a.Company = '1' 
       AND a.Date = '2013-05-06'
Dhanraj Mittal
sumber
9

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';
Ali
sumber
8
Saya cukup yakin DELETE hanya dapat menentukan satu tabel. Ini tidak berhasil untuk saya.
Stealth Rabbi
3
Saya percaya Anda dapat menentukan beberapa tabel untuk dihapus di mySQL, tetapi tidak SQL Server (yang ditanyakan).
dandev91
7

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 JOINbagian dalam CTEsaat Anda menginginkannya delete.

P ரதீப்
sumber
6

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'
Ady
sumber
2
Pertanyaan ini untuk SQL Server. Anda tidak dapat menghapus dari dua tabel dalam satu pernyataan di SQL Server. Pemahaman saya adalah ini dapat dilakukan di mysql dan MS Access.
Darren Griffith
6

Coba ini, ini mungkin bisa membantu

 DELETE WorkRecord2 
          FROM WorkRecord2 
    INNER JOIN Employee 
            ON EmployeeRun=EmployeeNo
         WHERE Company = '1' 
           AND Date = '2013-05-06';
viraj sharma
sumber
7
Apa bedanya dengan jawaban yang diterima: stackoverflow.com/questions/16481379/… ?
lokal default
3
Jawaban ini menggunakan penamaan tabel eksplisit daripada aliasing, membuatnya lebih mudah bagi mereka yang kurang berpengalaman untuk membaca / menangkap apa yang sedang terjadi.
Joshua Burns
1
@ JoshuaBurns: Masih duplikat jawaban saya .
hims056
4

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)
ozzy432836
sumber
4

Anda tidak menentukan tabel untuk CompanydanDate , 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 lebih sulit dibaca dan dipahami. Saya kira pola pikir yang paling baik dijelaskan dalam jawaban oleh @frans eilering yaitu orang yang menulis kode tidak selalu peduli dengan orang yang akan membaca dan memelihara kode.

suatu hari nanti
sumber
4

Inilah yang saat ini saya gunakan untuk menghapus atau bahkan memperbarui:

DELETE           w
FROM             WorkRecord2   w,
                 Employee      e
WHERE            w.EmployeeRun = e.EmployeeNo
             AND w.Company = '1' 
             AND w.Date = '2013-05-06'
PPJN
sumber