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'
nettoon493
quelle
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'
Taryn
quelle
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';
hims056
quelle
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 ....
)
Devart
quelle
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'
Behrouz Bakhtiari
quelle
16

Es sollte sein:

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

Diese Version sollte funktionieren

DELETE WorkRecord2
FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
Where Company = '1' AND Date = '2013-05-06'
AustinTX
quelle
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
frans eilering
quelle
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
quelle
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';
Ali
quelle
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.

P ரதீப்
quelle
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'
Ady
quelle
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';
Viraj Sharma
quelle
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)
ozzy432836
quelle
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.

eines Tages, wenn
quelle
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'
PPJN
quelle