Запрос также не работает должным образом в MySQL, кроме как случайно.
Неагрегированные столбцы в MySQL не являются частью стандарта SQL и даже не разрешены в MySQL 5.7 и более поздних версиях, если не изменено значение по умолчанию для режима ONLY_FULL_GROUP_BY
.
В более ранних версиях результат является недетерминированным .
Сервер может выбрать любое значение из каждой группы, поэтому, если они не совпадают, выбранные значения являются недетерминированными.Кроме того, на выбор значений из каждой группы нельзя повлиять, добавив предложение ORDER BY.
Это означает, что нет способа узнать, какие строки будут возвращены этим запросом:
SELECT S1.ID,S1.Template_ID,S1.Assigned_By,S1.Assignees,S1.Active
FROM "Schedule" AS S1
GROUP BY Template_ID;
Чтобы получить детерминированные результаты, вам нужен способ ранжирования строк с помощью функций ранжирования , представленных в MySQL 8, например ROW_NUMBER()
.Они уже доступны в SQL Server , по крайней мере, начиная с SQL Server 2012.Синтаксис одинаков для обеих баз данных:
WITH ranked as AS
(
SELECT
ID,Template_ID,Assigned_By,Assignees Active,
ROW_NUMBER(PARTITION BY Template_ID Order BY ID)
FROM Scheduled
WHERE Assignees IN(6, 3)
)
SELECT ID,Template_ID,Assigned_By,Assignees Active
FROM ranked
Where RN=1
PARTITION BY Template_ID
разбивает строки результатов на основе их значения Template_ID
на отдельные разделы.Внутри этого раздела строки упорядочены в соответствии с предложением ORDER BY
.Наконец, ROW_NUMBER
вычисляет номер строки для каждой упорядоченной строки раздела.