question de la théorie de requêtes SQL - une seule instruction vs requêtes multi-déclaration
-
19-09-2019 - |
Question
Quand j'écris requêtes SQL, je me surprends à penser souvent que « il n'y a aucun moyen de le faire avec une seule requête ». Quand cela arrive, je tourne souvent à des procédures ou des fonctions de valeur table à plusieurs instructions stockées qui utilisent des tables temporaires (d'une manière ou d'une autre) et finissent par la simple combinaison de résultats et retourner le tableau de résultats.
Je me demande si quelqu'un sait, simplement une question de théorie, si elle devrait possible d'écrire toute requête qui renvoie un seul jeu de résultats en une seule requête (pas plusieurs instructions). De toute évidence, j'ignore les points pertinents tels que la lisibilité du code et la maintenabilité, peut-être même les performances des requêtes / efficacité. Ceci est plus sur la théorie - peut-il être fait ... et ne vous inquiétez pas, je ne prévois certainement pas commencer à me forcer à écrire une requête à une seule instruction lorsque plusieurs instructions correspondent mieux à mon but dans tous les cas, mais il pourrait me faire réfléchir à deux fois ou un peu plus s'il existe un moyen viable pour obtenir le résultat d'une seule requête.
Je suppose que quelques paramètres sont dans l'ordre - je pense à une base de données relationnelle (comme MS SQL) avec des tables qui suivent les meilleures pratiques communes (telles que toutes les tables ayant une clé primaire et ainsi de suite)
Note: (. À partir de documents web ou quelque chose de similaire) afin de gagner « Accepté réponse » à ce sujet, vous devrez fournir une preuve définitive
La solution
Au moins, avec la version récente d'Oracle est tout à fait possible. Il a une « clause type » qui rend complet turation sql. (
Autres conseils
Je crois qu'il est possible. J'ai travaillé avec des requêtes très difficiles, des requêtes très longues, et souvent, il est possible de le faire avec une seule requête. Mais la plupart du temps, il est plus difficile à mantenir, donc si vous le faites avec une seule requête, assurez-vous commenter votre requête attentivement.
Je ne l'ai jamais rencontré quelque chose qui ne pouvait être fait en une seule requête.
Mais parfois, il est préférable de le faire dans plus d'une requête.
Je ne peux pas le prouver, mais je crois que la réponse est oui prudent - à condition que la conception de votre base de données se fait correctement. En général, forcé d'écrire plusieurs déclarations pour obtenir un certain résultat est un signe que votre schéma peut avoir besoin des améliorations.
Je dirais « oui » mais ne peut pas le prouver. Cependant, mon principal processus de pensée:
-
Toute sélection doit être une opération à base de jeu
-
Votre hypothèse est que vous traitez avec des ensembles mathématiquement correctes (ie normalisée correctement)
-
théorie juridique devrait garantir il est possible
D'autres pensées:
-
Multiple instruction SELECT charge souvent des tables temporaires / variables de table. Ceux-ci peuvent être dérivés ou séparés dans des CTE.
-
Tout traitement de RBAR (bons ou mauvais) être maintenant traitée CROSS / OUTER APPLY sur les tables dérivées
-
UDFs seraient classés comme « tricherie » dans ce contexte, je me sens, car il vous permet de mettre un SELECT dans un autre module plutôt que dans votre un seul
-
Non écrit autorisés dans votre "avant" séquence de DML: cela change l'état de SELECT pour sélectionner
-
Avez-vous vu une partie du code dans notre magasin?
Modifier, glossaire
Edit: POSTULER: tricher
SELECT
*
FROM
MyTable1 t1
CROSS APPLY
(
SELECT * FROM MyTable2 t2
WHERE t1.something = t2.something
) t2
En théorie oui, si vous utilisez des fonctions ou un labyrinthe tortueux de OUTER applys ou sous-requêtes; Cependant, pour une meilleure lisibilité et la performance, nous avons toujours fini par aller avec des tables temporaires et à plusieurs instructions des procédures stockées.
Comme quelqu'un ci-dessus a commenté, cela est généralement un signe que votre structure de données commence à sentir; pas que ce soit mauvais , mais que peut-être il est temps de denormalise pour des raisons de performance (arrive aux meilleurs d'entre nous), ou peut-être mettre une couche d'interrogation dénormalisé devant vos données « réelles » normalisées.