Подтвердить что ты не робот

Элементы ORDER BY должны отображаться в списке выбора, если указан параметр SELECT DISTINCT

Я добавил столбцы в списке выбора в список по списку, но он все еще дает мне ошибку:

Элементы ORDER BY должны появляться в списке выбора, если указан параметр SELECT DISTINCT.

Здесь хранится proc:

CREATE PROCEDURE [dbo].[GetRadioServiceCodesINGroup] 
@RadioServiceGroup nvarchar(1000) = NULL
AS
BEGIN
SET NOCOUNT ON;

SELECT DISTINCT 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  
ORDER BY rsc.RadioServiceCode,rsc.RadioServiceCodeId,rsc.RadioService

END
4b9b3361

Ответ 1

Попробуйте следующее:

ORDER BY 1, 2

ИЛИ

ORDER BY rsc.RadioServiceCodeId, rsc.RadioServiceCode + ' - ' + rsc.RadioService

Ответ 2

Хотя это не одно и то же, в некотором смысле 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

Ответ 3

Попробуйте выполнить одно из следующих действий:

  • Используйте псевдоним столбца:

    ORDER BY RadioServiceCodeId, RadioService

  • Используйте расположение столбца:

    ORDER BY 1,2

Вы можете заказывать только по столбцам, которые фактически появляются в результате запроса DISTINCT - базовые данные недоступны для заказа.

Ответ 4

Distinct и Group By обычно делают то же самое для разных целей... Оба они создают "рабочую" таблицу в памяти на основе столбцов, которые группируются, (или выбраны в предложении Select Distinct) - и затем заполнить эту рабочую таблицу, поскольку запрос считывает данные, добавляя новую "строку" только тогда, когда значения указывают на необходимость сделать это...

Единственное различие заключается в том, что в группе "В" есть дополнительные "столбцы" в рабочей таблице для любых вычисляемых полных полей, таких как Sum(), Count(), Avg() и т.д., которые необходимо обновить для каждого оригинала строка читается. Distinct не нужно это делать... В специальном случае, когда вы Group By только для получения отдельных значений (а также нет агрегатных столбцов на выходе), то это, вероятно, точно такой же план запроса.... Это было бы интересно просмотреть план выполнения запроса для двух параметров и посмотреть, что он сделал...

Конечно, Distinct - это способ чтения, если это то, что вы делаете (когда ваша цель состоит в том, чтобы устранить повторяющиеся строки и вы не вычисляете какие-либо столбцы совокупности)

Ответ 5

Когда вы определяете конкатенацию, вам нужно использовать ALIAS для нового столбца, если вы хотите заказать его в сочетании с DISTINCT Some Ex с sql 2008

--this works 

    SELECT DISTINCT (c.FirstName + ' ' + c.LastName) as FullName 
    from SalesLT.Customer c 
    order by FullName

--this works too

    SELECT DISTINCT (c.FirstName + ' ' + c.LastName) 
    from SalesLT.Customer c 
    order by 1

-- this doesn't 

    SELECT DISTINCT (c.FirstName + ' ' + c.LastName) as FullName 
    from SalesLT.Customer c 
    order by c.FirstName, c.LastName

-- the problem the DISTINCT needs an order on the new concatenated column, here I order on the singular column
-- this works

    SELECT DISTINCT (c.FirstName + ' ' + c.LastName) 
        as FullName, CustomerID 
        from SalesLT.Customer c 

order by 1, CustomerID

-- this doesn't

    SELECT DISTINCT (c.FirstName + ' ' + c.LastName) as FullName 
     from SalesLT.Customer c 
      order by 1, CustomerID

Ответ 6

Вы можете попробовать подзапрос:

SELECT DISTINCT TEST.* FROM (
    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  
    ORDER BY rsc.RadioServiceCode,rsc.RadioServiceCodeId,rsc.RadioService
) as TEST