Как SQL выбирает, какую строку отображать при группировании нескольких строк? - PullRequest
2 голосов
/ 18 мая 2011

Рассмотрим следующую таблицу:

CREATE TABLE t
(
 a INTEGER NOT NULL,
 b INTEGER NOT NULL,
 c INTEGER,
 PRIMARY KEY (a, b)
)

Теперь, если я сделаю это:

SELECT a,b,c FROM t GROUP BY a;

Я ожидаю получить каждое отдельное значение только один раз.Но так как я спрашиваю также о b и c, это даст мне строку для каждого значения a.Поэтому, если для одного значения a есть много строк на выбор, как я могу предсказать, какую строку выберет SQL?Мои тесты показывают, что он выбирает вернуть строку, для которой b является наибольшим.Но какова логика в этом?Как это применимо к строкам больших двоичных объектов, датам или чему-либо еще?

Мой вопрос: Как SQL выбирает, какую строку отображать при группировании нескольких строк?

Кстати: моя особая проблема касается SQLITE3, но я предполагаю, что это проблема SQL, не зависящая от СУБД ...

Ответы [ 4 ]

6 голосов
/ 18 мая 2011

Это на самом деле не должно работать в приличной СУБД: -)

Любой столбец, не используемый в предложении group by, должен быть объектом функции агрегирования, например:

select a, max(b), sum(c) from t group by a

Если не будет жаловаться в SQLite (и у меня нет непосредственной причины сомневаться в вас), я бы просто объяснил, как устроена СУБД.Из памяти есть несколько областей, в которых он не слишком беспокоится о «чистоте» данных (например, каждый столбец может содержать несколько типов, причем тип, принадлежащий данным в этой строке / столбце, пересекается, а неспецификация колонки).

2 голосов
/ 18 мая 2011

Все известные мне механизмы SQL будут жаловаться на запрос, который вы упомянули, с сообщением об ошибке типа «b и c появляются в списке полей, но не в группе по списку».Вам разрешено использовать только b или c в статистической функции (например, MAX / MIN / COUNT / AVG) или вы будете вынуждены добавить их в список GROUP BY.

0 голосов
/ 18 мая 2011

Дело не в том, какую базу данных выберет, а в том порядке, в котором ваши данные будут возвращены.

Ваш первичный ключ обрабатывает ваш порядок сортировки по умолчанию, поскольку вы его не указали.1003 *

Вы можете использовать Order By a, c, если это то, что вы хотите.

0 голосов
/ 18 мая 2011

Вы не совсем правы относительно своего предположения, что это не зависит от СУБД.Большинство СУБД не позволяют выбирать поля, которые также не входят в предложение GROUP BY.Исключениями из этого (насколько мне известно) являются SQLite и MySQL.В общем случае делать это не следует, поскольку значения b и c выбираются довольно произвольно (в зависимости от применяемого алгоритма группировки).Даже если это может быть задокументировано в вашей базе данных, всегда лучше выразить запрос таким образом, чтобы полностью и недвусмысленно указывать результат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...