SQLite3 не вызывает ошибку агрегации при неправильных / неопределенных запросах? - PullRequest
0 голосов
/ 23 января 2010

SQLite ведет себя иначе, когда имеет дело с агрегацией, чем многие другие СУБД. Рассмотрим следующую таблицу и значения:

create table foo (a int, b int);
insert into foo (a, b) values (1, 10);
insert into foo (a, b) values (2, 11);
insert into foo (a, b) values (3, 12);

Если я сделаю запрос так:

select a, group_concat(b) from foo;

Обычно я ожидал бы получить ошибку из-за того, что я не включил столбец «a» в предложение GROUP BY. Ниже приведена ошибка, создаваемая SQL Server (PostgreSQL выдаст нечто подобное).

Column 'foo.a' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

SQLite, с другой стороны, просто соглашается с этим и выдает такой результат:

3|10,11,12

Что хорошего в этом? Как он выбрал значение для столбца «а»? Если мы добавим еще одну строку, то, похоже, будет образец в том, что она выбирает, и, возможно, мы можем предположительно сказать, что она использует последнюю добавленную строку, хотя она может быть просто неопределенной.

sqlite> insert into foo (a, b) values (2, 13);
sqlite> select a, group_concat(b) from foo;
2|10,11,12,13

Мне это кажется ошибкой, но мне интересно, что наши эксперты по базе данных скажут об этом.

(Я использую SQLite версии 3.6.16 в Ubuntu.)

Ответы [ 2 ]

1 голос
/ 23 января 2010

Это полезное поведение в случаях, когда вы выбираете несколько сгруппированных столбцов, но вам нужен только механизм запросов, чтобы действительно протестировать один столбец для группировки. Возьмем для примера:

С учетом таблицы Orders и OrderDetails.

SELECT O.OrderID, O.OrderDate, SUM(OD.Price * OD.Quantity) TotalPrice
FROM Orders O NATURAL JOIN OrderDetails OD
GROUP BY O.OrderID

В других базах данных нам нужно было бы включить и OrderID, и OrderDate в группу по. Затем база данных будет группироваться по обоим столбцам, что в данном случае является избыточным. Группируя только по OrderID, мы получаем те же результаты с большей эффективностью и меньшим количеством кода.

0 голосов
/ 23 января 2010

MySQL также возвращает неопределенное значение для a из числа совпадающих строк, обычно первой. SQL Server и PostgreSQL просто защищают от лени, заставляя вас принять решение об устранении неоднозначности в каждом столбце.

...