วิธีการลบโดยใช้ INNER JOIN กับ SQL Server


1283

ฉันต้องการลบใช้INNER JOINในSQL Server 2008

แต่ฉันได้รับข้อผิดพลาดนี้:

ข่าวสารเกี่ยวกับ 156, ระดับ 15, สถานะ 1, บรรทัดที่ 15
ไวยากรณ์ไม่ถูกต้องใกล้กับคำหลัก 'INNER'

รหัสของฉัน:

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

2
ตัวอย่าง C ในเอกสารแสดงวิธีใช้DELETEกับการเข้าร่วม
Pondlife

1
ตัวอย่าง C ใช้เคอร์เซอร์และของอื่น ๆ ที่ไม่เกี่ยวข้อง
reggaeguitar

ลบจาก table1 จาก table1 t1 Inner join table2 t2 บน t1.id = t2.id; ในรายละเอียดyoutu.be/_tyUVrS2iH4
Amresh Kumar Singh

คำตอบ:


2241

คุณต้องระบุว่าจะลบตารางอะไรนี่คือรุ่นที่มีชื่อแทน:

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

9
@bluefeet คุณสามารถให้รูปแบบที่ถูกต้องสำหรับ SQL Server สำหรับการลบจากตารางทั้งสองหรือไม่
oabarca

44
@ user2070775 ใน SQL Server เพื่อลบจาก 2 ตารางคุณต้องใช้ 2 statement แยกกัน
Taryn

8
@ user2070775 ใน SQL Server คุณสามารถใช้ทรานแซคชันและหลอกตารางดังที่แสดงในstackoverflow.com/questions/783726/…
Mathieu Rodic

1
@MathieuRodic ขอบคุณสำหรับการแบ่งปัน ในการตั้งค่าของฉันถ้าฉันลบออกจาก 2 ตารางแยกกันฉันไม่รู้จริง ๆ อีกต่อไปว่าแถวไหนที่จะลบออกจากตารางที่ 2 ดังนั้นสิ่งนี้จะช่วยได้ :)
Verena Haunschmid

2
@ShahryarSaljoughi นั่นคือนามแฝงสำหรับตาราง WorkRecord2
Taryn

151

เพียงเพิ่มชื่อของตารางระหว่างDELETEและFROMจากที่คุณต้องการลบบันทึกเพราะเราต้องระบุตารางที่จะลบ ยังลบORDER BYข้อเพราะไม่มีอะไรจะสั่งในขณะที่ลบบันทึก

ดังนั้นข้อความค้นหาสุดท้ายของคุณควรเป็นดังนี้:

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

3
อันนี้ใช้งานได้กับ SQL Server ถ้าคุณตั้งใจจะลบออกจากตารางแรกเท่านั้น
TroySteven

1
@matwonk: คุณสามารถลบจากตารางที่สองเป็นหากคุณใช้ชื่อของตารางที่สอง เช่นการใช้DELETE EmployeeจะลบจากตารางพนักงานแทนWorkRecord2ตาราง
056

1
@matwonk: นี่คือตัวอย่าง: 1) การลบจากตารางแรก 2) การลบจากตารางที่สอง
hims056

30

เป็นไปได้ว่าสิ่งนี้มีประโยชน์สำหรับคุณ -

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

หรือลองนี้ -

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

1
นี่เป็นคำตอบเดียวที่ใช้งานได้บน SQL Server เพียงสร้างแบบสอบถามของคุณเช่นเลือก Id จาก ... เข้าร่วม ... เข้าร่วม ฯลฯ แล้วห่อมันเป็นแบบสอบถามย่อยและทำลบจาก (ตาราง) ที่ Id ใน (แบบสอบถามย่อย)
Chris Moschini



11

รุ่นนี้ควรใช้งานได้

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

11

ใน Studio จัดการเซิร์ฟเวอร์ SQL ฉันสามารถสร้างSELECTแบบสอบถามได้อย่างง่ายดาย

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

ฉันสามารถเรียกใช้งานได้และรายชื่อติดต่อทั้งหมดของฉันจะปรากฏ

ตอนนี้เปลี่ยนSELECTเป็นDELETE:

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

บันทึกทั้งหมดที่คุณเห็นในSELECTคำสั่งจะถูกลบออก

คุณอาจสร้างการเข้าร่วมภายในที่ยากขึ้นได้ด้วยขั้นตอนเดียวกันเช่น:

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


9

ลองใช้แบบสอบถามนี้:

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
ฉันค่อนข้างมั่นใจว่า DELETE สามารถระบุได้เพียงหนึ่งตารางเท่านั้น มันไม่ได้ผลสำหรับฉัน
Stealth Rabbi

3
ฉันเชื่อว่าคุณสามารถระบุหลายตารางสำหรับการลบใน mySQL แต่ไม่ใช่ SQL Server (ซึ่งคำถามถาม)
dandev91

7

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 

หมายเหตุ:เราไม่สามารถใช้JOINภายในเมื่อคุณต้องการCTEdelete


6

นี่เป็นแบบสอบถามแบบง่าย ๆ ในการลบระเบียนออกจากสองตารางพร้อมกัน

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

2
คำถามนี้สำหรับ SQL Server คุณไม่สามารถลบจากสองตารางในหนึ่งคำสั่งใน SQL Server ความเข้าใจของฉันคือสิ่งนี้สามารถทำได้ใน mysql และ MS Access
Darren Griffith

6

ลองสิ่งนี้มันอาจช่วยได้

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

7
แตกต่างจากคำตอบที่ยอมรับได้อย่างไร: stackoverflow.com/questions/16481379/… ?
โลแคลเริ่มต้น

3
คำตอบนี้ใช้การตั้งชื่อตารางอย่างชัดเจนแทนที่จะเป็นนามแฝงทำให้ผู้ที่มีประสบการณ์น้อยในการอ่าน / ตรวจสอบสิ่งที่เกิดขึ้น
Joshua Burns

1
@JoshuaBurns: คำตอบของฉันยังคงเหมือนเดิมทุกประการ
hims056

4

นี่คือรุ่นของ SQL Server ของฉัน

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

คุณไม่ได้ระบุตารางสำหรับCompanyและDateคุณอาจต้องการแก้ไข

SQL มาตรฐานที่ใช้MERGE:

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

คำตอบจาก @Devart ยังเป็น SQL มาตรฐาน แต่ไม่สมบูรณ์ควรมีลักษณะดังนี้:

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

สิ่งสำคัญที่ควรทราบเกี่ยวกับข้างต้นคือมันชัดเจนว่าการลบกำลังกำหนดเป้าหมายไปยังตารางเดียวดังที่บังคับใช้ในตัวอย่างที่สองโดยกำหนดให้มีแบบสอบถามย่อยแบบสเกลาร์

สำหรับฉันคำตอบที่เป็นกรรมสิทธิ์ของไวยากรณ์ต่างๆนั้นยากต่อการอ่านและทำความเข้าใจ ฉันเดาว่าความคิดนั้นอธิบายได้ดีที่สุดในคำตอบของ @frans eilering นั่นคือคนที่เขียนรหัสไม่จำเป็นต้องสนใจคนที่จะอ่านและดูแลรหัส


4

นี่คือสิ่งที่ฉันใช้ในการลบหรืออัพเดตในปัจจุบัน:

DELETE           w
FROM             WorkRecord2   w,
                 Employee      e
WHERE            w.EmployeeRun = e.EmployeeNo
             AND w.Company = '1' 
             AND w.Date = '2013-05-06'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.