Come eliminare utilizzando INNER JOIN con SQL Server?


1283

Voglio eliminare utilizzando INNER JOINin SQL Server 2008 .

Ma ottengo questo errore:

Messaggio 156, livello 15, stato 1, riga 15
Sintassi errata vicino alla parola chiave "INTERNO".

Il mio codice:

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

2
L'esempio C nella documentazione mostra come utilizzare DELETEun join
Pondlife

1
L'esempio C usa un cursore e anche un mucchio di cose estranee
reggaeguitar

Elimina dalla tabella1 dalla tabella1 t1 join interno table2 t2 su t1.id = t2.id; in dettaglio youtu.be/_tyUVrS2iH4
Amresh Kumar Singh

Risposte:


2241

Devi specificare da quale tabella stai eliminando, ecco una versione con un alias:

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

9
@bluefeet potresti fornire la sintassi giusta per SQL Server per l'eliminazione da entrambe le tabelle?
oabarca,

44
@ user2070775 In SQL Server per eliminare da 2 tabelle è necessario utilizzare 2 istruzioni separate.
Taryn

8
@ user2070775 in SQL Server, è possibile utilizzare transazioni e pseudo-tabelle, come mostrato in stackoverflow.com/questions/783726/…
Mathieu Rodic

1
@MathieuRodic grazie per la condivisione. Nel mio setup, se cancello separatamente dalle 2 tabelle, non so più quali righe eliminare dalla seconda tabella, quindi questo mi aiuterà :)
Verena Haunschmid,

2
@ShahryarSaljoughi che è l'alias per la tabella WorkRecord2.
Taryn

151

Basta aggiungere il nome della tabella tra DELETEe FROMda dove si desidera eliminare i record perché è necessario specificare la tabella da eliminare. Rimuovi anche la ORDER BYclausola perché non c'è nulla da ordinare durante l'eliminazione dei record.

Quindi la tua query finale dovrebbe essere così:

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

3
Questo funziona su SQL Server se si intende eliminare solo dalla prima tabella.
TroySteven,

1
@matwonk: è possibile eliminare dalla seconda tabella se si utilizza il nome della seconda tabella. Ad esempio, l'utilizzo DELETE Employeeverrà eliminato dalla tabella Dipendente anziché dalla WorkRecord2tabella.
hims056


30

Possibile che ciò ti sia utile -

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

Oppure prova questo -

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

1
Questa è l'unica risposta che funziona su SQL Server. Crea la tua query come seleziona Id da ... unisciti ... unisciti ecc quindi avvolgilo come una sottoquery ed esegui una cancellazione da (tabella) dove Id in (sottoquery)
Chris Moschini,

28

Prova questo:

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

16

Dovrebbe essere:

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

11

Questa versione dovrebbe funzionare

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

11

In SQL Server Management Studio posso facilmente creare una SELECTquery.

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

Posso eseguirlo e vengono mostrati tutti i miei contatti.

Ora cambia SELECTin a DELETE:

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

Tutti i record visualizzati SELECTnell'istruzione verranno rimossi.

Puoi anche creare un join interno più difficile con la stessa procedura, ad esempio:

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

Prova questa query:

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
Sono abbastanza sicuro che un DELETE possa specificare solo una tabella. Questo non funziona per me.
Stealth Rabbi

3
Credo che sia possibile specificare più tabelle per l'eliminazione in mySQL, ma non SQL Server (che la domanda pone).
dandev91,

7

Un altro modo di usare 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 

Nota: non possiamo usare JOINdentro CTEquando vuoi delete.


6

Questa è una semplice query per eliminare i record da due tabelle alla volta.

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

2
Questa domanda è per SQL Server. Non è possibile eliminare da due tabelle in un'istruzione in SQL Server. La mia comprensione è che ciò può essere fatto in mysql e MS Access.
Darren Griffith,

6

Prova questo, potrebbe aiutare

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

7

3
Questa risposta utilizza la denominazione esplicita della tabella anziché l'aliasing, rendendo più semplice per coloro che hanno meno esperienza leggere / afferrare ciò che sta succedendo.
Joshua Burns,

1
@JoshuaBurns: duplicato ancora esatto della mia risposta .
hims056

4

Ecco la mia versione di 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

Non si specificano le tabelle per CompanyeDate , potresti volerlo correggere.

SQL standard usando MERGE:

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

La risposta di @Devart è anche SQL standard sebbene incompleta, dovrebbe apparire più simile a questa:

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

La cosa importante da notare a proposito di quanto sopra è chiaro che l'eliminazione sta prendendo di mira una singola tabella, come imposto nel secondo esempio richiedendo una sottoquery scalare.

Per me le varie risposte alla sintassi proprietaria sono più difficili da leggere e comprendere. Immagino che la mentalità sia meglio descritta nella risposta di @frans eilering, cioè la persona che scrive il codice non si preoccupa necessariamente della persona che leggerà e manterrà il codice.


4

Ecco cosa uso attualmente per eliminare o persino aggiornare:

DELETE           w
FROM             WorkRecord2   w,
                 Employee      e
WHERE            w.EmployeeRun = e.EmployeeNo
             AND w.Company = '1' 
             AND w.Date = '2013-05-06'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.