Je me trouve souvent en train d'ajouter des expressions dans la clause group by
qui, j'en suis sûr, sont uniques. Il s'avère parfois que je me trompe - à cause d'une erreur dans mon SQL ou d'une supposition erronée, et cette expression n'est pas vraiment unique.Une fonction d'agrégat qui n'autorise qu'une entrée unique
Il y a beaucoup de cas où je préférerais que cela génère une erreur SQL plutôt que d'étendre mon jeu de résultats en mode silencieux et parfois très subtilement.
J'aimerais pouvoir faire quelque chose comme:
select product_id, unique description from product group by product_id
mais il est évident que je ne peux pas mettre en œuvre moi-même - mais quelque chose presque aussi concis peut être mis en oeuvre avec des agrégats définis par l'utilisateur sur certaines bases de données.
Un agrégat spécial qui n'accepte qu'une valeur d'entrée unique peut-il être utile dans toutes les versions de SQL? Si oui, une telle chose pourrait-elle être implémentée maintenant sur la plupart des bases de données? Les valeurs null
doivent être considérées comme n'importe quelle autre valeur - contrairement à la façon dont l'agrégat avg
fonctionne généralement. (J'ai ajouté des réponses pour implémenter ceci pour postgres et Oracle.)
L'exemple suivant est destiné à montrer comment l'agrégat serait utilisé, mais est un cas simple où il est évident que les expressions doivent être uniques. l'utilisation réelle serait plus probable dans les grandes questions où il est plus facile de faire des hypothèses erronées au sujet de l'unicité
tables:
product_id | description
------------+-------------
1 | anvil
2 | brick
3 | clay
4 | door
sale_id | product_id | cost
---------+------------+---------
1 | 1 | £100.00
2 | 1 | £101.00
3 | 1 | £102.00
4 | 2 | £3.00
5 | 2 | £3.00
6 | 2 | £3.00
7 | 3 | £24.00
8 | 3 | £25.00
requêtes:
> select * from product join sale using (product_id);
product_id | description | sale_id | cost
------------+-------------+---------+---------
1 | anvil | 1 | £100.00
1 | anvil | 2 | £101.00
1 | anvil | 3 | £102.00
2 | brick | 4 | £3.00
2 | brick | 5 | £3.00
2 | brick | 6 | £3.00
3 | clay | 7 | £24.00
3 | clay | 8 | £25.00
> select product_id, description, sum(cost)
from product join sale using (product_id)
group by product_id, description;
product_id | description | sum
------------+-------------+---------
2 | brick | £9.00
1 | anvil | £303.00
3 | clay | £49.00
> select product_id, solo(description), sum(cost)
from product join sale using (product_id)
group by product_id;
product_id | solo | sum
------------+-------+---------
1 | anvil | £303.00
3 | clay | £49.00
2 | brick | £9.00
cas d'erreur:
> select solo(description) from product;
ERROR: This aggregate only allows one unique input
quelle base de données vous utilisez MySQL, Oracle, est-il est une fonction solo dans une base MySQL – XMen
@Rahul ceci une question SQL générale - j'espère obtenir des réponses pour les bases de données que je ne connais pas (postgres et Oracle) –