web-dev-qa-db-fra.com

Variables de table avec un alias dans une instruction Delete From

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".

41
Anagoge

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

alt text

52
dance2die

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.

8
Joe Pineda