Wie lösche ich mit INNER JOIN mit SQL Server?


1283

Ich möchte mit INNER JOINin SQL Server 2008 löschen .

Aber ich bekomme diesen Fehler:

Nachricht 156, Ebene 15,
Status 1, Zeile 15 Falsche Syntax in der Nähe des Schlüsselworts 'INNER'.

Mein Code:

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

2
Beispiel C in der Dokumentation zeigt, wie man DELETEmit einem Join verwendet
Pondlife

1
Beispiel C verwendet auch einen Cursor und ein paar fremde
Dinge

Löschen aus Tabelle1 aus Tabelle1 t1 innere Verknüpfungstabelle2 t2 auf t1.id = t2.id; im Detail youtu.be/_tyUVrS2iH4
Amresh Kumar Singh

Antworten:


2241

Sie müssen angeben, aus welcher Tabelle Sie löschen möchten. Hier ist eine Version mit einem Alias:

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

9
@bluefeet Können Sie die richtige Syntax für SQL Server zum Löschen aus beiden Tabellen bereitstellen?
Oabarca

44
@ user2070775 In SQL Server müssen Sie zum Löschen aus 2 Tabellen 2 separate Anweisungen verwenden.
Taryn

8
@ user2070775 in SQL Server können Sie Transaktionen und Pseudotabellen
Mathieu Rodic

1
@ MathieuRodic danke fürs Teilen. Wenn ich in meinem Setup aus den 2 Tabellen separat lösche, weiß ich nicht mehr wirklich, welche Zeilen aus der 2. Tabelle gelöscht werden sollen, damit dies hilft :)
Verena Haunschmid

2
@ShahryarSaljoughi, das ist der Alias ​​für die WorkRecord2-Tabelle.
Taryn

151

Fügen Sie einfach den Namen der Tabelle zwischen DELETEund FROMvon dem Ort hinzu, an dem Sie Datensätze löschen möchten, da wir die zu löschende Tabelle angeben müssen. Entfernen Sie auch die ORDER BYKlausel, da beim Löschen von Datensätzen nichts zu bestellen ist.

Ihre letzte Anfrage sollte also so aussehen:

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

3
Dieser funktioniert unter SQL Server, wenn Sie nur aus der ersten Tabelle löschen möchten.
TroySteven

1
@matwonk: Sie können aus der zweiten Tabelle löschen, wenn Sie den Namen der zweiten Tabelle verwenden. ZB wird mit using DELETE Employeeaus der Tabelle des Mitarbeiters anstelle der WorkRecord2Tabelle gelöscht .
hims056

1
@matwonk: Hier ist ein Beispiel: 1) Löschen aus der ersten Tabelle 2) Löschen aus der zweiten Tabelle .
hims056

30

Möglicherweise ist dies hilfreich für Sie -

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

Oder versuchen Sie dies -

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

1
Dies ist die einzige Antwort, die auf SQL Server funktioniert. Erstellen Sie einfach Ihre Abfrage wie wählen Sie ID aus ... Join ... Join usw., wickeln Sie sie dann als Unterabfrage ein und löschen Sie sie aus (Tabelle), wobei ID in (Unterabfrage)
Chris Moschini

28

Versuche dies:

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

16

Es sollte sein:

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

11

Diese Version sollte funktionieren

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

11

In SQL Server Management Studio kann ich einfach eine SELECTAbfrage erstellen .

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

Ich kann es ausführen und alle meine Kontakte werden angezeigt.

Ändern Sie nun das SELECTin a DELETE:

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

Alle Datensätze, die Sie in der SELECTAnweisung gesehen haben, werden entfernt.

Sie können mit derselben Prozedur sogar eine schwierigere innere Verknüpfung erstellen, zum Beispiel:

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

Versuchen Sie diese Abfrage:

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
Ich bin mir ziemlich sicher, dass ein DELETE nur eine Tabelle angeben kann. Das funktioniert bei mir nicht.
Stealth Rabbi

3
Ich glaube, Sie können in mySQL mehrere Tabellen zum Löschen angeben, nicht jedoch SQL Server (was in der Frage gestellt wird).
dandev91

7

Ein anderer Weg mit 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 

Hinweis: Wir können das JOINInnere nicht verwenden, CTEwenn Sie möchten delete.


6

Dies ist eine einfache Abfrage, um die Datensätze aus zwei Tabellen gleichzeitig zu löschen.

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

2
Diese Frage bezieht sich auf SQL Server. Sie können in SQL Server nicht aus zwei Tabellen in einer Anweisung löschen. Meines Wissens nach kann dies in MySQL und MS Access erfolgen.
Darren Griffith

6

Versuchen Sie dies, es könnte helfen

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

7
Wie unterscheidet es sich von der akzeptierten Antwort: stackoverflow.com/questions/16481379/… ?
Standardgebietsschema

3
Diese Antwort verwendet explizite Tabellennamen anstelle von Aliasing, was es für weniger erfahrene Benutzer einfacher macht, zu lesen / zu verstehen, was gerade passiert.
Joshua Burns

1
@JoshuaBurns: Immer noch genaues Duplikat meiner Antwort .
hims056

4

Hier ist meine SQL Server-Version

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

Sie geben die Tabellen für Companyund nicht anDate möchten dies möglicherweise beheben.

Standard SQL mit MERGE:

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

Die Antwort von @Devart ist auch Standard SQL, obwohl unvollständig, sollte eher so aussehen:

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

Das Wichtige an dem oben Gesagten ist, dass klar ist, dass das Löschen auf eine einzelne Tabelle abzielt, wie im zweiten Beispiel erzwungen, indem eine skalare Unterabfrage erforderlich ist.

Für mich sind die verschiedenen proprietären Syntaxantworten schwerer zu lesen und zu verstehen. Ich denke, die Denkweise für wird am besten in der Antwort von @frans eilering beschrieben, dh die Person, die den Code schreibt, kümmert sich nicht unbedingt um die Person, die den Code lesen und pflegen wird.


4

Folgendes verwende ich derzeit zum Löschen oder sogar Aktualisieren:

DELETE           w
FROM             WorkRecord2   w,
                 Employee      e
WHERE            w.EmployeeRun = e.EmployeeNo
             AND w.Company = '1' 
             AND w.Date = '2013-05-06'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.