2009-10-04 6 views
1

Je sais que la plupart des logiciels de serveur SQL vous permet de faire "Une mise à jour sur une jointure", mais je me demande, est-ce dans les normes SQL? (par exemple, puis-je supposer que tout logiciel le permet?)SQL: Mise à jour sur la jointure, dans les normes?

Remarque: Je pose cette question parce que j'écris une bibliothèque de base de données qui devrait être facilement extensible au logiciel de base de données qui n'est pas inclus dans la version d'origine. En tant que tel, il ne sert à rien de répondre par une remarque telle que "a, b, c et b permettent tous - ensemble, ils constituent le lionshare du marché, donc vous pouvez supposer que tous les logiciels le permettent". Non, je m'intéresse à savoir si c'est dans les normes ou non.

Répondre

1

Selon la norme ANSI SQL-92, une table UPDATE sur JOINed ne fait PAS partie des normes; Voir http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt sections 13.9 et 13.10 (vous devrez rechercher 391, le numéro de page).

J'ai essayé de trouver un standard ANSI 2003, mais le plus proche était ici: www.wiscorp.com/sql_2003_standard.zip (un brouillon tardif). Il n'y avait pas de différence substantielle entre les deux en ce qui concerne l'instruction UPDATE et la syntaxe JOIN.

Stu

2

Vous présumez que tous les progiciels sont conformes aux normes ANSI SQL ... En réalité, aucun d'entre eux dont je suis au courant ne respecte entièrement les normes.

Si vous souhaitez adhérer aux normes ANSI SQL, le meilleur point de départ serait d'utiliser les normes documentées elles-mêmes. Voici le document SQL-92:

http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

+0

Je ne suis pas sous cette impression. Pour autant que je sache, tous les logiciels largement utilisés offrent cette fonctionnalité. Si, en plus de cela, il est dans la norme, je peux l'utiliser et je serai en mesure de supporter tout logiciel SQL qui supporte les normes assez bien. Si elles ne supportent pas la fonction pendant qu'elle est dans la norme, leur mauvaise. Maintenant, si ce n'est pas dans les normes, c'est une histoire différente. Dans ce cas, j'ai simplement utilisé une fonction créée par une grande entreprise et d'autres suivies, et pour cette raison, je ne serai pas en mesure de prendre en charge les logiciels SQL qui n'ont pas suivi. – Jasper

+0

Merci pour le lien. Je vais regarder à travers - bien que ce soit une douleur de trouver tout ce que vous cherchez, donc si quelqu'un venait à le savoir, cela serait toujours apprécié. – Jasper

3

Si je comprends la bonne question, je pense que la réponse est non, il n'y a pas de norme « mise à jour basée sur une jointure ». Le postgres manual page for UPDATE comprend ceci sous « Compatibilité »:

Cette commande est conforme à la norme SQL, à l'exception que les clauses FROM et sont des extensions PostgreSQL RETOURNANT.

Bien que cela ne dit pas explicitement, il est pas, les notes de compatibilité dans ce manuel Remarque En général quand il y a un apparenté, mais pas identique, dans les standards.

2

Attention maintenant, les gens. L'écriture d'un code vraiment portable est beaucoup plus difficile que vous ne l'imaginez et vous devez également être prêt à abandonner beaucoup dans les domaines de la performance, de la facilité de codage/maintenance et de la lisibilité. Il suffit de déclarer et d'utiliser une variable dans, disons, SQL Server et votre code n'est plus vraiment portable. Ecrire un déclencheur d'audit et je peux garantir que votre déclencheur ne sera pas portable entre Oracle, SQL Server et plusieurs autres moteurs populaires. Et, cela devrait vraiment avoir de l'importance parce que ce n'est pas une science de base dans un SGBDR (enfin, sauf peut-être pour écrire une UPDATE intégrée dans Oracle sans utiliser MERGE {standard mais pas encore portable}).

De plus, n'oubliez pas qu'il existe deux types de base de SQL. Celle qui prend en charge la nature à une seule ligne de la plupart du code frontal et celle du code de traitement par lots. Si vous voulez vraiment que votre code de traitement par lots fonctionne bien, vous utiliserez plusieurs des "extensions propriétaires" du moteur de base de données que vous utilisez pour traiter efficacement parfois des milliards de lignes durant la nuit ... le même soir. ;-)

Soyez prudent lorsque vous essayez d'écrire du code pour une "vraie" portabilité. Vous pourriez vous retrouver avec un désordre embrouillé qui est beaucoup plus lent que vous ne l'auriez jamais imaginé.

Questions connexes