Comment supprimer en utilisant INNER JOIN avec SQL Server?

1283

Je souhaite supprimer à l'aide INNER JOINde SQL Server 2008 .

Mais je reçois cette erreur:

Msg 156, niveau 15, état 1, ligne 15
Syntaxe incorrecte près du mot clé "INNER".

Mon code:

DELETE FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
nettoon493
la source
2
L'exemple C de la documentation montre comment utiliser DELETEune jointure
Pondlife
1
Exemple C utilise également un curseur et un tas de choses étrangères
reggaeguitar
Supprimer de table1 de table1 t1 jointure interne table2 t2 sur t1.id = t2.id; en détails youtu.be/_tyUVrS2iH4
Amresh Kumar Singh

Réponses:

2243

Vous devez spécifier de quelle table vous supprimez, voici une version avec un alias:

DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
  ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
Taryn
la source
9
@bluefeet pourriez-vous fournir la bonne syntaxe pour SQL Server pour la suppression des deux tables?
oabarca
44
@ user2070775 Dans SQL Server pour supprimer de 2 tables, vous devez utiliser 2 instructions distinctes.
Taryn
8
@ user2070775 dans SQL Server, vous pouvez utiliser des transactions et des pseudo-tables, comme indiqué dans stackoverflow.com/questions/783726/…
Mathieu Rodic
1
@MathieuRodic merci pour le partage. Dans ma configuration, si je supprime séparément des 2 tables, je ne sais plus vraiment quelles lignes supprimer de la 2ème table, cela vous aidera donc :)
Verena Haunschmid
2
@ShahryarSaljoughi qui est l'alias de la table WorkRecord2.
Taryn
151

Ajoutez simplement le nom de la table entre DELETEet FROMd'où vous souhaitez supprimer les enregistrements car nous devons spécifier la table à supprimer. Supprimez également la ORDER BYclause car il n'y a rien à commander lors de la suppression d'enregistrements.

Votre requête finale devrait donc être comme ceci:

    DELETE WorkRecord2 
      FROM WorkRecord2 
INNER JOIN Employee 
        ON EmployeeRun=EmployeeNo
     WHERE Company = '1' 
       AND Date = '2013-05-06';
hims056
la source
3
Celui-ci fonctionne sur SQL Server si vous avez uniquement l'intention de supprimer de la première table.
TroySteven
1
@matwonk: Vous pouvez supprimer de la deuxième table si vous utilisez le nom de la deuxième table. Par exemple, l'utilisation DELETE Employeesupprimera de la table des employés au lieu de la WorkRecord2table.
hims056
1
@matwonk: Voici un exemple: 1) Suppression de la première table 2) Suppression de la deuxième table .
hims056
30

Cela peut-il vous être utile -

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

Ou essayez ceci -

DELETE FROM dbo.WorkRecord2 
WHERE EXISTS(
    SELECT 1
    FROM dbo.Employee e
    WHERE EmployeeRun = e.EmployeeNo
        AND ....
)
Devart
la source
1
C'est la seule réponse qui fonctionne sur Sql Server. Créez simplement votre requête comme sélectionnez l'ID à partir de ... joindre ... rejoignez etc, puis encapsulez-la en tant que sous-requête et supprimez de (table) où Id dans (sous-requête)
Chris Moschini
28

Essaye ça:

DELETE FROM WorkRecord2 
       FROM Employee 
Where EmployeeRun=EmployeeNo
      And Company = '1' 
      AND Date = '2013-05-06'
Behrouz Bakhtiari
la source
16

Ça devrait être:

DELETE zpost 
FROM zpost 
INNER JOIN zcomment ON (zpost.zpostid = zcomment.zpostid)
WHERE zcomment.icomment = "first"       
yoginder bagga
la source
11

Cette version devrait fonctionner

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

Dans SQL Server Management Studio, je peux facilement créer une SELECTrequête.

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

Je peux l'exécuter et tous mes contacts sont affichés.

Maintenant changez le SELECTen a DELETE:

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

Tous les enregistrements que vous avez vus dans la SELECTdéclaration seront supprimés.

Vous pouvez même créer une jointure interne plus difficile avec la même procédure, par exemple:

DELETE FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
INNER JOIN LoginBedrijf ON Bedrijf.IDLoginBedrijf = LoginBedrijf.IDLoginBedrijf
frans eilering
la source
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
la source
9

Essayez cette requête:

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
la source
8
Je suis sûr qu'un DELETE ne peut spécifier qu'une seule table. Ça ne marche pas pour moi.
Stealth Rabbi
3
Je pense que vous pouvez spécifier plusieurs tables à supprimer dans mySQL, mais pas SQL Server (ce que la question pose).
dandev91
7

Une autre façon d'utiliser 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 

Remarque: nous ne pouvons pas utiliser l' JOINintérieur CTElorsque vous le souhaitez delete.

P ரதீப்
la source
6

Il s'agit d'une requête simple pour supprimer les enregistrements de deux tables à la fois.

DELETE table1.* ,
       table2.* 
FROM table1 
INNER JOIN table2 ON table1.id= table2.id where table1.id ='given_id'
Ady
la source
2
Cette question s'adresse à SQL Server. Vous ne pouvez pas supprimer de deux tables dans une instruction dans SQL Server. Ma compréhension est que cela peut être fait dans mysql et MS Access.
Darren Griffith
6

Essayez ceci, cela pourrait aider

 DELETE WorkRecord2 
          FROM WorkRecord2 
    INNER JOIN Employee 
            ON EmployeeRun=EmployeeNo
         WHERE Company = '1' 
           AND Date = '2013-05-06';
viraj sharma
la source
7
En quoi est-elle différente de la réponse acceptée: stackoverflow.com/questions/16481379/… ?
locale par défaut
3
Cette réponse utilise un nom de table explicite plutôt qu'un alias, ce qui rend plus facile pour ceux moins expérimentés de lire / comprendre ce qui se passe.
Joshua Burns
1
@JoshuaBurns: Toujours le double exact de ma réponse .
hims056
4

Voici ma version de 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)
ozzy432836
la source
4

Vous ne spécifiez pas les tables pour CompanyetDate , vous voudrez peut-être corriger cela.

SQL standard utilisant 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 réponse de @Devart est également Standard SQL bien qu'incomplète, devrait ressembler davantage à ceci:

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

La chose importante à noter à propos de ce qui précède est qu'il est clair que la suppression cible une seule table, comme imposé dans le deuxième exemple en exigeant une sous-requête scalaire.

Pour moi, les différentes réponses de syntaxe propriétaires sont plus difficiles à lire et à comprendre. Je suppose que l'état d'esprit est mieux décrit dans la réponse de @frans eilering, c'est-à-dire que la personne qui écrit le code ne se soucie pas nécessairement de la personne qui lira et maintiendra le code.

un jour
la source
4

Voici ce que j'utilise actuellement pour supprimer ou même mettre à jour:

DELETE           w
FROM             WorkRecord2   w,
                 Employee      e
WHERE            w.EmployeeRun = e.EmployeeNo
             AND w.Company = '1' 
             AND w.Date = '2013-05-06'
PPJN
la source