J'ai besoin de créer une instruction SQL à supprimer de certains tableaux des enregistrements correspondant à une autre instruction SELECT.
dans Teradata Nous utilisons p> 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: p> Comment utiliser avec..delete clause? Y a-t-il d'une autre manière? P> p>
5 Réponses :
Cela devrait le faire:
DELETE Table1
from Table1 t1
inner join tempTable t2
on t2.Col1 = t1.Col1
and t2.Col2 = t1.Col2
... 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
delete from table1 t1 where exists ( select 1 from table2 t2 where t1.col1 = t2.col1 and t1.col2 > t2.col2 )
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.
Créez d'abord une requête qui sélectionne les lignes dont vous avez besoin: 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
with tempTable(col1,col2) as ( select col1,col2 from table2 ) delete table1 from tempTable where table1.col1 = tempTable.col1 and table1.col2 = tempTable.col2
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: B> Pour les réponses de codes, telles que celle-ci, Downvote, ne supprimez pas! a>
Cela fonctionne pour moi