MySQL нарушая SQL стандарт - PullRequest
0 голосов
/ 12 февраля 2020

В этой статье о ANSI SQL 99 standard requirement group by говорится:

список выбора оператора может состоять только из ссылок на столбцы, которые имеют одно значение для группы - это означает, что список выбора не может содержать ссылку на промежуточный столбец результата, который также не включен в предложение GROUP BY

Но в MySQL мы можем сделать это:

select b
from a
group by c

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

Я уже прочитал этот ответ об этой топике c, но я хотел бы знать, является ли это нарушением, или его можно рассматривать как (скажем, есть пример, который говорит "быть строго к SQL стандарту", и я написал это как результат), а не почему это работает или что-то еще.

1 Ответ

2 голосов
/ 12 февраля 2020

Я изначально неправильно понял вопрос.

MySQL больше не поддерживает:

select b
from a
group by c;

(по крайней мере, с использованием настроек по умолчанию). Ура! Это возвращает ошибку точно так же, как и должно быть, и почти во всех других базах данных (я думаю, что SQLite может быть последним препятствием).

Это нарушение стандарта - в целом (см. ниже). Проблема в том, что одна строка возвращается на c значение. Все, кроме c в GROUP BY должно быть аргументом для GROUP BY.

В одном случае это разрешено. Это когда c является первичным или уникальным ключом в a (технически называемый «функционально зависимым»). В этом случае вы можете выбрать другие столбцы из таблицы без функций агрегирования. Postgres - это одна из баз данных, которая поддерживает это.

Если вам нужно одно значение b на c, тогда каноническое решение будет выглядеть примерно так:

select max(b)
from a
group by c;

Postgres также предлагает distinct on, что обеспечивает большую гибкость:

select distinct on (c) b
from a
order by c, random();
...