Je souhaite supprimer des lignes d'une variable de table SQL Server 2000/2005 en fonction de la présence d'autres lignes dans la même table (supprimez toutes les lignes de 0 compte si une ligne de compte non 0 existe avec la même date). Voici un exemple simplifié qui ne devrait supprimer que la ligne ajoutée en premier:
declare @O table (
Month datetime,
ACount int NULL
)
insert into @O values ('2009-01-01', 0)
insert into @O values ('2009-01-01', 1)
insert into @O values ('2008-01-01', 1)
insert into @O values ('2007-01-01', 0)
delete from @O o1
where ACount = 0
and exists (select Month from @O o2 where o1.Month = o2.Month and o2.ACount > 0)
Le problème est que je ne peux pas faire en sorte que le serveur SQL accepte l'alias o1 de la variable de table (et je pense qu'un alias est requis en raison du "o1.Month = o2.Month
"correspondant aux noms de champ). L'erreur est:
Msg 102, niveau 15, état 1, ligne 11
Syntaxe incorrecte près de "o1".
Spécifiez le nom d'alias avant FROM instruction Signification, vous supprimez de la table aliasée.
delete o1
from @O as o1
where ACount = 0
and exists ( select Month
from @O o2
where o1.Month = o2.Month
and o2.ACount > 0)
Résultat
Essayez ceci, cela devrait fonctionner (le premier FROM est facultatif):
DELETE [FROM] @O
FROM @O o1
where ACount = 0
and exists (select Month from @O o2
where o1.Month = o2.Month and o2.ACount > 0)
La justification est la suivante: DELETE, comme expliqué ici , attend d'abord une table non aliasée, un FROM optionnel peut la précéder. Après cela, vous pouvez mettre un alias sur une table dans le deuxième FROM, si vous avez besoin de faire un JOIN, une sous-requête, etc.