8
votes

SQL Server Supprimer et avec clause

J'ai besoin de créer une instruction SQL à supprimer de certains tableaux des enregistrements correspondant à une autre instruction SELECT.

dans Teradata Nous utilisons xxx

tandis que dans SQL Server, il n'est pas autorisé à avoir plus d'une colonne dans la clause Where. Je pensais que je peux utiliser la clause avec la clause: xxx

Comment utiliser avec..delete clause? Y a-t-il d'une autre manière?


0 commentaires

5 Réponses :


22
votes

Cela devrait le faire:

DELETE Table1
 from Table1 t1
  inner join tempTable t2
   on t2.Col1 = t1.Col1
    and t2.Col2 = t1.Col2


4 commentaires

... vous pouvez utiliser la clause avec la clause, mais cette façon est plus simple.


En y pensant, je ne vois aucune raison d'utiliser la clause avec la clause. J'utilise avec quand les choses seraient sérieusement en désordre ou complexes et la suppression d'une table basée sur une jointure simple à une autre table n'est pas complexe pour justifier l'effort de codage supplémentaire.


Je conviens que la création d'un CTE (avec) n'est pas vraiment justifiée, mais sur la façon dont il est juste là. La jointure dans la réponse est à la CTE (notez le nom ...).


Si vous souhaitez utiliser un CTE (avec), vous devez spécifier à partir de quelle table que vous souhaitez supprimer. Dans l'exemple que vous avez donné ci-dessus, vous auriez besoin de la requête suivante (notez la "Supprimer T1" au lieu de "Supprimer" de "): avec Temptable (Col1, Col2) As (Select Col1, Col2 de Table2) Supprimer T1 de TABLE1 T1 où t1.col1 = tentable.col1 et t1.col2 = tentable.col2



1
votes
delete from table1 t1 where exists 
  ( 

   select 1 from table2 t2 where t1.col1 = t2.col1 and t1.col2 > t2.col2

)

1 commentaires

La syntaxe est incorrecte, mais l'idée générale est correcte. SQL Server peut l'optimiser, de sorte qu'il devrait fonctionner ainsi qu'une solution à l'aide d'une jointure tout en étant plus facile à lire IMO.



4
votes

Créez d'abord une requête qui sélectionne les lignes dont vous avez besoin: xxx pré>

testez em> pour vous assurer qu'il retourne exactement les rangées que vous souhaitez supprimer. Puis transformez-le en une instruction DELETE en modifiant "Sélectionnez" sur "Supprimer" et supprimez la liste des colonnes: P>

DELETE t1
FROM [Table1] t1
INNER JOIN [Table2] t2 ON t1.[col1] = t2.[col1] AND t1.[Col


0 commentaires

0
votes
with tempTable(col1,col2) as (
  select col1,col2
  from table2
)
delete table1 from tempTable
where table1.col1 = tempTable.col1
and table1.col2 = tempTable.col2

2 commentaires

Il est toujours préférable d'inclure certaines explications plutôt que de simplement avoir une réponse uniquement de code que cela le rend plus utile aux futurs lecteurs.


Bienvenue dans le débordement de la pile! Bien que cette extrait de code puisse résoudre le problème, cela n'explique pas pourquoi ni comment il répond à la question. S'il vous plaît Inclure une explication de votre code , car cela aide vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question des lecteurs à l'avenir, et ces personnes pourraient ne pas connaître les raisons de votre suggestion de code. Flagriers / critiques: Pour les réponses de codes, telles que celle-ci, Downvote, ne supprimez pas!



0
votes

Cela fonctionne pour moi xxx


0 commentaires