Comment réutiliser une colonne de résultat dans une expression par une autre colonne de résultat
Exemple:
SELECT
(SELECT SUM(...) FROM ...) as turnover,
(SELECT SUM(...) FROM ...) as cost,
turnover - cost as profit
Sûr que ce n'est pas valide (au moins dans Postgres) mais comment atteindre le même dans une requête sans avoir à réécrire la sous-requête deux fois?
- Dépend des détails, tels que les colonnes & tables impliquées.
- Ponis: Comme? N'est-ce pas là une manière générale pour tel?
- Je suis d'accord avec @OMG. Cela dit, si vous pouvez écrire une sous-requête qui renvoie à la fois
turnover
etcost
que les colonnes, la requête enveloppé autour de cette sous-requête peut effectuerturnover - cost
. Pour plus de détails, nous allons avoir besoin de quelques détails au sujet de votre schéma. - Pensez aussi à utiliser des "expressions de table communes" aka CTE. Voir stackoverflow.com/questions/2686919/... et postgresql.org/docs/8.4/static/queries-with.html
- Édité le titre: cette question ne met pas l'accent sur la réutilisation de sous-requêtes (tables), mais plutôt de simples colonnes, à la différence de stackoverflow.com/q/2686919/648265 .
- Voir également la réponse à cette question comment utiliser les alias dans le calcul
SELECT 10 AS my_num, (SELECT my_num) * 5 AS another_number FROM table
Vous devez vous connecter pour publier un commentaire.
Comme suit:
select from table1, table2
vous obtenez le CROSS JOINTURE des deux tables. Ce n'select from (table1, table2) as bla
(comme vous l'avez ici) avec les deux tables?... from ((select ...) as turnover, (select ...) as cost) as partial_sums
-- je me demande encore comment exactement le chiffre d'affaires et les coûts de sous-sélections sont combinés?select 1 as foo, 2 as bar
.Il est possible de réutiliser la requête comme ceci:
Ceci est équivalent à :
Il y a un point à noter ici. La première méthode est plus lisible et réutilisable, mais la seconde méthode peut être plus rapide, parce que la bd pouvait choisir un meilleur plan pour elle.
Peut-être le sql "avec" clause pourrait aider, tel que présenté ici http://orafaq.com/node/1879 (d'autres bases de données telles que Postgres faire aussi bien, et pas seulement oracle).
En fait j'ai fait beaucoup de travail sur ce, et a frappé de nombreux murs de briques, mais enfin trouvé une réponse, plus d'un hack, mais il a très bien fonctionné et a réduit le lire surcharge de mes requêtes de 90%....
Donc, plutôt que de dupliquer la requête corrélée à de nombreuses reprises pour récupérer plusieurs colonnes de la sous-requête, j'ai simplement utilisé la concaténation de toutes les valeurs que je veux revenir en séparés par des virgules, varchar, puis déroulez-les de nouveau dans l'application...
Ainsi, au lieu de
Maintenant, je ne
J'ai maintenant tous les trois corrélée 'scalaire' les valeurs qui me sont nécessaires, mais n'avait qu'à exécuter la sous-requête en corrélation une fois au lieu de trois fois.
JOIN
labigcorrelatedsubquery
avecoutertable
une fois, au lieu de répéter plusieurs fois ou en recourant à la méthode concat hack. Même dans le pire des cas, vous pouvez avoir factorisé que la sous-requête comme une expression de table commune pour éviter de la répéter.Je pense que la suite va travailler:
Non testé sur les animaux - vous allez être le premier! 🙂
De partager et de profiter.
Utiliser une croix appliquer ou à l'extérieur de l'appliquer.