Je n'arrive pas à décomposer les requêtes SQL simples. J'utilise PostgreSQL mais ma question est également liée à d'autres SGBDR.Décomposition de requête PostgreSQL
Considérons l'exemple suivant. Nous avons des ordres de table et nous voulons trouver la première commande après dont le montant total a dépassé une certaine limite:
drop table if exists orders cascade;
/**
Table with clients' orders
*/
create table orders(
date timestamp,
amount integer
/**
Other columns omitted
*/
);
/**
Populate with test data
*/
insert into orders(date,amount)
values
('2011-01-01',50),
('2011-01-02',49),
('2011-01-03',2),
('2011-01-04',1000);
/**
Selects first order that caused exceeding of limit
*/
create view first_limit_exceed
as
select min(date) from
(
select o1.date
from orders o1,
orders o2
where o2.date<=o1.date
group by o1.date
having sum(o2.amount) > 100
) limit_exceed;
/**
returns "2011-01-03 00:00:00"
*/
select * from first_limit_exceed;
Maintenant, nous allons rendre le problème un peu plus difficile. Considérons que nous voulons trouver le montant total seulement pour les lignes qui satisfont certains prédicats. Nous avons beaucoup de tels prédicats et la création d'une version séparée de la vue first_limit_exceed serait une duplication terrible du code. Nous avons donc besoin d'un moyen de créer une vue paramétrée et de passer un ensemble de lignes filtrées ou de lui-même se prédire. Dans Postgres, nous pouvons utiliser des fonctions de langage de requête en tant que vues paramétrées. Mais Postgres ne permet pas à la fonction d'obtenir comme argument ni ensemble de ligne ni une autre fonction. Je peux toujours utiliser l'interpolation de chaîne du côté client ou de la fonction plpgsql, mais elle est sujette aux erreurs et difficile à tester et à déboguer. Un conseil?
+1 pour l'affichage des scripts de table. Tout ce que fait @dvv! – Quassnoi
peut-être que c'est stupide, mais vous pourriez avoir une vue dont les colonnes étaient les résultats de prédicats (donc chaque type de colonne est booléen). puis ajouter un nouveau prédicat impliquerait (1) d'étendre la vue avec un nouveau prédicat et (2) de changer le code à sélectionner sur le nouveau nom de colonne. Cela maintient la logique de requête assez simple, mais place les prédicats dans sql. –