Comment supprimer en utilisant INNER JOIN avec SQL Server?

je veux supprimer en utilisant INNER JOIN dans SQL Server 2008 .

mais je reçois cette erreur:

Msg 156, Niveau 15, État 1, Ligne 15

Syntaxe incorrecte près du mot "INNER".

mon code:

DELETE FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
926
demandé sur Daniel Serodio 2013-05-10 15:38:21

15 réponses

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'
1644
répondu Taryn 2016-08-24 17:12:34

il suffit d'ajouter le nom de la table entre DELETE et FROM d'où vous voulez supprimer des enregistrements parce que nous devons spécifier la table à supprimer. Supprimez aussi la clause ORDER BY parce qu'il n'y a rien à commander lors de la suppression d'enregistrements.

ainsi votre requête finale devrait être comme ceci:

    DELETE WorkRecord2 
      FROM WorkRecord2 
INNER JOIN Employee 
        ON EmployeeRun=EmployeeNo
     WHERE Company = '1' 
       AND Date = '2013-05-06';
106
répondu hims056 2013-05-10 12:07:59

essayez ceci:

DELETE FROM WorkRecord2 
       FROM Employee 
Where EmployeeRun=EmployeeNo
      And Company = '1' 
      AND Date = '2013-05-06'
25
répondu Behrouz Bakhtiari 2013-05-10 17:37:22

Possible ce soit utile pour vous -

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

Ou d'essayer de ...

DELETE FROM dbo.WorkRecord2 
WHERE EXISTS(
    SELECT 1
    FROM dbo.Employee e
    WHERE EmployeeRun = e.EmployeeNo
        AND ....
)
21
répondu Devart 2013-05-10 12:19:01

il devrait être:

DELETE zpost 
FROM zpost 
INNER JOIN zcomment ON (zpost.zpostid = zcomment.zpostid)
WHERE zcomment.icomment = "first"       
11
répondu yoginder bagga 2014-09-17 13:12:28

cette version devrait fonctionner

DELETE WorkRecord2
FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
Where Company = '1' AND Date = '2013-05-06'
8
répondu AustinTX 2014-08-12 19:56:15

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';
8
répondu Sarbaz 2014-09-17 13:37:01

dans SQL Server Management Studio je peux facilement créer une requête SELECT.

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.

changez maintenant la commande SELECT pour supprimer:

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

tous les enregistrements que vous avez vus dans L'énoncé SELECT seront supprimés.

vous pouvez même créer une jonction intérieure 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
6
répondu frans eilering 2015-06-01 21:40:04
 DELETE a FROM WorkRecord2 a 
       INNER JOIN Employee b 
       ON a.EmployeeRun = b.EmployeeNo 
       Where a.Company = '1' 
       AND a.Date = '2013-05-06'
4
répondu Dhanraj Mittal 2015-04-29 17:19:51

vous ne spécifiez pas les tables pour Company et Date , vous pourriez vouloir 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 aussi SQL Standard bien qu'incomplète, devrait ressembler plus à 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 vise une seule table, comme appliqué dans le deuxième exemple en exigeant une sous-requête scalaire.

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

2
répondu onedaywhen 2016-05-19 13:22:19

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 

Note : On ne peut pas utiliser JOIN à l'intérieur CTE quand vous voulez delete .

2
répondu Pரதீப் 2016-09-10 15:10:40

C'est une simple requête 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'
2
répondu Ady 2017-09-20 17:04:25

voici ma version de serveur SQL

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)
1
répondu ozzy432836 2016-03-09 09:28:26

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

DELETE FROM      w
FROM             WorkRecord2   w,
                 Employee      e
WHERE            w.EmployeeRun = e.EmployeeNo
             AND w.Company = '1' 
             AND w.Date = '2013-05-06'
1
répondu PPJN 2017-02-22 14:50:17

Essayez cela, il peut aider à

 DELETE WorkRecord2 
          FROM WorkRecord2 
    INNER JOIN Employee 
            ON EmployeeRun=EmployeeNo
         WHERE Company = '1' 
           AND Date = '2013-05-06';
1
répondu viraj sharma 2018-04-10 07:26:59