Parmi d'autres questions, Celui-ci a demandé comment Supprimer d'une jointure . P>
Ma question: combien de cela est standard SQL? Sur quelles bases de données cela fonctionnerait-il réellement (notamment pour moi serait Oracle, MySQL et SQLSERVER)? P>
6 Réponses :
Je utilisais des requêtes similaires lorsque j'étais sur un serveur MS SQL. Pas sûr des autres. P>
Supprimer ... de .. ne fait pas partie des normes ANSI, ni de la mise à jour ... de ... à ce sujet. Cela inclut une syntaxe de jointure, car la jointure ne peut être spécifiée qu'avec. P>
Tous les fournisseurs implémentent ceci dans une forme ou une autre. P>
Et la manière standard de supprimer avec la jointure sur d'autres tables consiste à utiliser l'instruction Fusionner code>, si disponible avec votre DB spécifique.
La dernière fois que j'ai examiné la norme ANSI, la méthode préférée était la sous-requête et non des jointures. Lorsqu'il s'agissait d'une seule implémentation, où le portage de votre code n'est pas un problème, vous pouvez utiliser des extensions spécifiques au fournisseur librement, quand elles sont plus efficaces (bien que la mise à jour de, et j'imagine que la suppression de certains scénarios a été imprévisible: < Un href = "https://sqlserverfast.com/blog/hugo/2008/03/lets-deprecate-update-de/" rel = "NOFOollow Noreferrer"> https://sqlserverfast.com/blog/hugo/2008/ 03 / permet de déprécation-mise à jour - de / ). Personnellement, j'utilise généralement des CTES pour de nombreuses opérations de suppression ... mais mon développement est limité au serveur SQL et je n'ai pas à vous inquiéter de la portabilité du tout. La fusion peut également être un bon choix lorsque vous effectuez plusieurs opérations DML, mais à nouveau, cela n'est pas implémenté de la même manière (ou du tout) sur tous les fournisseurs. p>
Dans votre cas, je dirais que rester loin de la suppression de ... Inscrivez-vous parce que la syntaxe variera légèrement sur les trois plates-formes. Si vous utilisez des procédures stockées, cela est moins un problème que si le SQL est intégré à vos applications, mais toujours un problème néanmoins. P>
Non standard selon International Standard ISO / CEI 9075: 1992 < / a> section 13.6, pages 384-386. Supprimer avec la syntaxe de jointure ne fonctionnera pas dans Oracle. P>
Salut Dcookie, voyez ma réponse pour un exemple de travail de Supprimer avec une jointure à Oracle =)
Cela fonctionnera réellement à Oracle. Le mot clé est facultatif: Les règles pour supprimer une jointure sont les mêmes que les règles à Mettre à jour une jointure: Oracle modifiera les lignes d'une seule table et uniquement s'il n'y a pas d'ambiguïté pour identifier les lignes de la table de base. Regarder dans Cela ou Ceci donc pour Exemple. P> Construisons un petit exemple: P> Suppr (requête) code> est identique que
Suppr de (requête) code>.
SQL> DELETE FROM (SELECT t_child.*
2 FROM t_child
3 JOIN t_parent ON t_parent.id = t_child.parent_id
4 WHERE t_parent.name = 'a');
2 rows deleted
Combien de ceci est standard SQL? Peut-être que je devrais poser une autre question .. Supprimer de SELECT ..?!
La syntaxe standard SQL-92 nécessitait une sous-requête scalaire. Il s'agit d'une solution relativement solide car il n'y a pas d'ambiguïté (contrairement aux alternatives exclusives pouvant donner des résultats imprévisibles / inattendus).
Cependant, l'un des inconvénients de l'approche SQL-92 est qu'il peut être verbeux et impliquer des constructions répétitives par exemple. p>
UPDATE MyTable SET col1 = ( SELECT T.colA FROM OtherTable T WHERE T.ID = MyTable.ID ), col2 = ( SELECT T.colB FROM OtherTable T WHERE T.ID = MyTable.ID ) WHERE EXISTS ( SELECT * FROM OtherTable T WHERE T.ID = MyTable.ID );