web-dev-qa-db-fra.com

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, Etat 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'
1122
nettoon493

Vous devez spécifier la table à supprimer, 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'
1970
Taryn

Ajoutez simplement le nom de la table entre DELETE et FROM à partir duquel vous souhaitez supprimer des enregistrements, car nous devons spécifier la table à supprimer. Supprimez également la clause ORDER BY parce qu'il n'y a rien à commander lors de la suppression d'enregistrements.

Donc, votre dernière requête devrait être comme ceci:

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

Essaye ça:

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

Cela pourrait être utile pour vous -

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 ....
)
24
Devart

CA devrait etre:

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

Cette version devrait fonctionner

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

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';
7
Ali

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.

Maintenant changez la SELECT en DELETE:

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

Tous les enregistrements que vous avez vus dans l'instruction SELECT 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
6
frans eilering
 DELETE a FROM WorkRecord2 a 
       INNER JOIN Employee b 
       ON a.EmployeeRun = b.EmployeeNo 
       Where a.Company = '1' 
       AND a.Date = '2013-05-06'
5
Dhanraj Mittal

Essayez ceci, cela pourrait aider

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

Une autre façon en utilisant 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 JOIN à l'intérieur de CTE lorsque vous souhaitez delete.

3
Pரதீப்

Ceci est 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'
2
Ady

Vous ne spécifiez pas les tables pour Company et Date, vous voudrez peut-être résoudre ce problème.

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 le SQL standard, bien que incomplet, 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 vise une seule table, comme l’exige 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. J'imagine que la réponse à @frans eilering décrit le mieux l'état d'esprit, c'est-à-dire que la personne qui écrit le code ne se soucie pas nécessairement de la personne qui lira et conservera le code.

2
onedaywhen

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)
1
ozzy432836

Voici ce que j'utilise actuellement pour supprimer ou même pour 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
PPJN