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'
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'
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';
essayez ceci:
DELETE FROM WorkRecord2
FROM Employee
Where EmployeeRun=EmployeeNo
And Company = '1'
AND Date = '2013-05-06'
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 ....
)
il devrait être:
DELETE zpost
FROM zpost
INNER JOIN zcomment ON (zpost.zpostid = zcomment.zpostid)
WHERE zcomment.icomment = "first"
cette version devrait fonctionner
DELETE WorkRecord2
FROM WorkRecord2
INNER JOIN Employee ON EmployeeRun=EmployeeNo
Where Company = '1' AND Date = '2013-05-06'
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';
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
DELETE a FROM WorkRecord2 a
INNER JOIN Employee b
ON a.EmployeeRun = b.EmployeeNo
Where a.Company = '1'
AND a.Date = '2013-05-06'
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.
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
.
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'
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)
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'
Essayez cela, il peut aider à
DELETE WorkRecord2
FROM WorkRecord2
INNER JOIN Employee
ON EmployeeRun=EmployeeNo
WHERE Company = '1'
AND Date = '2013-05-06';