Я часто нахожу, что добавляю выражения в предложение group by
, которое, я уверен, уникально. Иногда получается, что я ошибаюсь - из-за ошибки в моем SQL или ошибочном предположении, и это выражение действительно не уникально.Агрегатная функция, которая допускает только один уникальный вход
Есть много случаев, когда я бы очень хотел, чтобы это породило SQL-ошибку, а не расширяло мой набор результатов молча, а иногда и очень тонко.
Я хотел бы быть в состоянии сделать что-то вроде:
select product_id, unique description from product group by product_id
, но очевидно, что я не могу осуществить это сам - но что-то столь же лаконичным могут быть реализованы с помощью определяемых пользователем агрегатов на некоторых базах данных.
Будет ли полезен специальный агрегат, который позволяет только одно уникальное входное значение во всех версиях SQL? Если да, может ли такая вещь быть реализована сейчас в большинстве баз данных? Значения null
следует рассматривать так же, как и любое другое значение - в отличие от способа работы встроенного агрегата avg
. (Я добавил ответы с методами реализации этого для postgres и Oracle.)
Следующий пример предназначен для того, чтобы показать, как будет использоваться совокупность, но это простой случай, когда очевидно, какие выражения должны быть уникальными. Реальное использование было бы более вероятно, будет в больших запросах, где это легче сделать ошибочные предположения о единственности
таблице:
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
запросов: случай
> 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
ошибки:
> select solo(description) from product;
ERROR: This aggregate only allows one unique input
, какую базу данных вы используете MySQL, Oracle, Есть ли какие-либо персональная функция в MySQL – XMen
@Rahul это общий вопрос SQL - я надеюсь получить ответы на базы данных, которые мне не знакомы (postgres и Oracle) – 2010-12-18 14:44:20