Хотя это не одно и то же, в некотором смысле DISTINCT подразумевает GROUP BY, потому что каждый DISTINCT может быть переписан с использованием GROUP BY. Имея это в виду, не имеет смысла заказывать что-то, чего нет в совокупной группе.
Например, если у вас есть такая таблица:
col1 col2
---- ----
1 1
1 2
2 1
2 2
2 3
3 1
, а затем попробуйте запросить его так:
SELECT DISTINCT col1 FROM [table] WHERE col2 > 2 ORDER BY col1, col2
Это не имеет смысла, потому что может в конечном итоге быть несколькими значениями col2 в строке. Какой из них следует использовать для заказа? Конечно, в этом запросе вы знаете, что результаты не будут такими, но сервер базы данных не может знать об этом заранее.
Теперь ваш случай немного отличается. Вы включили все столбцы из предложения order by
в предложение select
, и поэтому на первый взгляд может показаться, что все они сгруппированы. Однако некоторые из этих столбцов были включены в вычисляемое поле. Когда вы делаете это в сочетании с различными, директива distinct
может только применяться к окончательным результатам вычисления: она ничего не знает об источнике вычисления больше.
Это означает, что сервер на самом деле не знает, что может больше рассчитывать на эти столбцы. Он знает, что они были использованы, но не знает, может ли операция вычисления вызвать эффект, подобный моему первому простому примеру выше.
Так что теперь вам нужно сделать что-то еще, чтобы сообщить серверу, что столбцы можно использовать для заказа. Есть несколько способов сделать это, но этот подход должен работать хорошо:
SELECT rsc.RadioServiceCodeId,
rsc.RadioServiceCode + ' - ' + rsc.RadioService as RadioService
FROM sbi_l_radioservicecodes rsc
INNER JOIN sbi_l_radioservicecodegroups rscg
ON rsc.radioservicecodeid = rscg.radioservicecodeid
WHERE rscg.radioservicegroupid IN
(SELECT val FROM dbo.fnParseArray(@RadioServiceGroup,','))
OR @RadioServiceGroup IS NULL
GROUP BY rsc.RadioServiceCode,rsc.RadioServiceCodeId,rsc.RadioService
ORDER BY rsc.RadioServiceCode,rsc.RadioServiceCodeId,rsc.RadioService