Làm cách nào để xóa bằng INNER THAM GIA với SQL Server?


1283

Tôi muốn xóa bằng cách sử INNER JOINtrong SQL Server 2008 .

Nhưng tôi nhận được lỗi này:

Msg 156, Cấp 15, Trạng thái 1, Dòng 15
Cú pháp không chính xác gần từ khóa 'INNER'.

Mã của tôi:

DELETE FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'

2
Ví dụ C trong tài liệu cho thấy cách sử dụng DELETEvới sự tham gia
Pondlife

1
Ví dụ C cũng sử dụng một con trỏ và một loạt các công cụ không liên quan
reggaeg Ức

Xóa khỏi bảng1 khỏi bảng1 t1 tham gia bên trong bảng2 t2 trên t1.id = t2.id; chi tiết youtu.be/_tyUVrS2iH4
Amresh Kumar Singh

Câu trả lời:


2241

Bạn cần xác định bảng nào bạn đang xóa, đây là phiên bản có bí danh:

DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
  ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'

9
@bluefeet bạn có thể cung cấp cú pháp đúng cho SQL Server để xóa khỏi cả hai bảng không?
oabarca

44
@ user2070775 Trong SQL Server để xóa từ 2 bảng, bạn cần sử dụng 2 câu lệnh riêng biệt.
Taryn

8
@ user2070775 trong SQL Server, bạn có thể sử dụng các giao dịch và bảng giả, như được hiển thị trong stackoverflow.com/questions/783726/
Kẻ

1
@MathieuRodic cảm ơn vì đã chia sẻ. Trong thiết lập của tôi nếu tôi xóa riêng biệt khỏi 2 bảng, tôi thực sự không biết nên xóa hàng nào từ bảng thứ 2 để điều này có ích :)
Verena Haunschmid

2
@ShahryarSaljoughi đó là bí danh cho bảng WorkRecord2.
Taryn

151

Chỉ cần thêm tên của bảng giữa DELETEFROMtừ nơi bạn muốn xóa các bản ghi vì chúng tôi phải chỉ định bảng cần xóa. Cũng loại bỏ ORDER BYmệnh đề vì không có gì để đặt hàng trong khi xóa hồ sơ.

Vì vậy, truy vấn cuối cùng của bạn nên như thế này:

    DELETE WorkRecord2 
      FROM WorkRecord2 
INNER JOIN Employee 
        ON EmployeeRun=EmployeeNo
     WHERE Company = '1' 
       AND Date = '2013-05-06';

3
Cái này hoạt động trên SQL Server nếu bạn chỉ có ý định xóa khỏi bảng đầu tiên.
TroySteven

1
@matwonk: Bạn có thể xóa từ bảng thứ hai sang nếu bạn sử dụng tên của bảng thứ hai. Ví dụ: sử dụng DELETE Employeesẽ xóa khỏi bảng Nhân viên thay vì WorkRecord2bảng.
hims056

1
@matwonk: Đây là một ví dụ: 1) Xóa khỏi bảng đầu tiên 2) Xóa khỏi bảng thứ hai .
hims056

30

Điều này có thể hữu ích cho bạn -

DELETE FROM dbo.WorkRecord2 
WHERE EmployeeRun IN (
    SELECT e.EmployeeNo
    FROM dbo.Employee e
    WHERE ...
)

Hoặc thử cái này -

DELETE FROM dbo.WorkRecord2 
WHERE EXISTS(
    SELECT 1
    FROM dbo.Employee e
    WHERE EmployeeRun = e.EmployeeNo
        AND ....
)

1
Đây là câu trả lời duy nhất hoạt động trên Sql Server. Chỉ cần xây dựng truy vấn của bạn như chọn Id từ ... tham gia ... tham gia, sau đó bọc nó dưới dạng truy vấn con và xóa từ (bảng) trong đó Id trong (truy vấn phụ)
Chris Moschini

28

Thử cái này:

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

16

Nó nên là:

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

11

Phiên bản này sẽ hoạt động

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

11

Trong SQL Server Management Studio tôi có thể dễ dàng tạo một SELECTtruy vấn.

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

Tôi có thể thực hiện nó, và tất cả các liên hệ của tôi được hiển thị.

Bây giờ thay đổi SELECTđến một DELETE:

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

Tất cả các hồ sơ bạn nhìn thấy trong SELECTtuyên bố sẽ được xóa.

Bạn thậm chí có thể tạo ra một kết nối bên trong khó khăn hơn với cùng một thủ tục, ví dụ:

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

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'

9

Hãy thử truy vấn này:

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';

8
Tôi khá chắc chắn rằng một XÓA chỉ có thể chỉ định một bảng. Điều này không làm việc cho tôi.
Rabbi tàng hình

3
Tôi tin rằng bạn có thể chỉ định nhiều bảng để xóa trong myQuery, nhưng không phải là SQL Server (câu hỏi yêu cầu).
dandev91

7

Một cách khác sử dụng 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 

Lưu ý: Chúng tôi không thể sử dụng JOINbên trong CTEkhi bạn muốn delete.


6

Đây là một truy vấn đơn giản để xóa các bản ghi từ hai bảng cùng một lúc.

DELETE table1.* ,
       table2.* 
FROM table1 
INNER JOIN table2 ON table1.id= table2.id where table1.id ='given_id'

2
Câu hỏi này dành cho SQL Server. Bạn không thể xóa từ hai bảng trong một câu lệnh trong SQL Server. Sự hiểu biết của tôi là điều này có thể được thực hiện trong mysql và MS Access.
Darren Griffith

6

Hãy thử nó, nó có thể giúp

 DELETE WorkRecord2 
          FROM WorkRecord2 
    INNER JOIN Employee 
            ON EmployeeRun=EmployeeNo
         WHERE Company = '1' 
           AND Date = '2013-05-06';

7
Nó khác với câu trả lời được chấp nhận như thế nào: stackoverflow.com/questions/16481379/ trên ?
ngôn ngữ mặc định

3
Câu trả lời này sử dụng cách đặt tên bảng rõ ràng thay vì bí danh, làm cho nó ít hơn đối với những người ít kinh nghiệm để đọc / nắm bắt những gì đang diễn ra.
Joshua Burns

1
@JoshuaBurns: Vẫn trùng lặp chính xác câu trả lời của tôi .
hims056

4

Đây là phiên bản SQL Server của tôi

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)

4

Bạn không chỉ định các bảng cho CompanyDate , bạn có thể muốn sửa nó.

SQL chuẩn sử dụng MERGE:

MERGE WorkRecord2 T
   USING Employee S
      ON T.EmployeeRun = S.EmployeeNo
         AND Company = '1'
         AND Date = '2013-05-06'
WHEN MATCHED THEN DELETE;

Câu trả lời từ @Devart cũng là SQL chuẩn mặc dù chưa hoàn chỉnh, nên trông giống như thế này:

DELETE 
  FROM WorkRecord2
  WHERE EXISTS ( SELECT *
                   FROM Employee S
                  WHERE S.EmployeeNo = WorkRecord2.EmployeeRun
                        AND Company = '1'
                        AND Date = '2013-05-06' );

Điều quan trọng cần lưu ý ở trên là rõ ràng việc xóa đang nhắm mục tiêu vào một bảng duy nhất, như được thi hành trong ví dụ thứ hai bằng cách yêu cầu truy vấn vô hướng.

Đối với tôi các câu trả lời cú pháp độc quyền khác nhau khó đọc và khó hiểu hơn. Tôi đoán suy nghĩ được mô tả tốt nhất trong câu trả lời của @frans eilering tức là người viết mã không nhất thiết phải quan tâm đến người sẽ đọc và duy trì mã.


4

Đây là những gì tôi hiện đang sử dụng để xóa hoặc thậm chí, cập nhật:

DELETE           w
FROM             WorkRecord2   w,
                 Employee      e
WHERE            w.EmployeeRun = e.EmployeeNo
             AND w.Company = '1' 
             AND w.Date = '2013-05-06'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.