Los elementos ORDER BY deben aparecer en la lista select si se especifica SELECT DISTINCT


He añadido las columnas de la lista select a la lista order by, pero todavía me está dando el error:

ORDENAR POR elementos debe aparecer en la lista seleccionar si se especifica SELECCIONAR DISTINTO.

Aquí está el proc almacenado:

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
Author: Xaisoft, 2008-11-05

6 answers

Prueba esto:

ORDER BY 1, 2

O

ORDER BY rsc.RadioServiceCodeId, rsc.RadioServiceCode + ' - ' + rsc.RadioService
 53
Author: Chris Van Opstal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-05 16:11:31

Si bien no son la misma cosa, en un sentido DISTINTO implica un GRUPO POR, porque cada DISTINTO podría ser reescrito usando GRUPO POR en su lugar. Con eso en mente, no tiene sentido ordenar por algo que no está en el grupo agregado.

Por ejemplo, si tienes una tabla como esta:

col1  col2
----  ----
 1     1
 1     2
 2     1
 2     2
 2     3
 3     1

Y luego intenta consultarlo así:

SELECT DISTINCT col1 FROM [table] WHERE col2 > 2 ORDER BY col1, col2

Eso no tendría sentido, porque allí podría terminar siendo múltiples valores de col2 por fila. ¿Cuál debería ¿se usa para la orden? Por supuesto, en esta consulta sabes que los resultados no serían de esa manera, pero el servidor de base de datos no puede saberlo de antemano.

Ahora, su caso es un poco diferente. Usted incluyó todas las columnas de la cláusula order by en la cláusula select, y por lo tanto parecería a primera vista que todas estaban agrupadas. Sin embargo, algunas de esas columnas se incluyeron en un campo calculado. Cuando haces eso en combinación con distinct, la directiva distinct solo puede ser aplicado a los resultados finales del cálculo: ya no sabe nada sobre la fuente del cálculo.

Esto significa que el servidor ya no sabe que puede contar con esas columnas. Sabe que se usaron, pero no sabe si la operación de cálculo podría causar un efecto similar a mi primer ejemplo simple anterior.

Así que ahora necesita hacer algo más para decirle al servidor que las columnas están bien para usar para ordenar. Hay hay varias maneras de hacerlo, pero este enfoque debería funcionar bien:

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
 42
Author: Joel Coehoorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-24 00:43:52

Prueba uno de estos:

  1. Use el alias de la columna:

    PEDIDO POR RadioServiceCodeId, RadioService

  2. Utilice la posición de la columna:

    ORDENAR POR 1,2

Solo puede ordenar por columnas que realmente aparecen en el resultado de la consulta DISTINTA; los datos subyacentes no están disponibles para ordenar.

 9
Author: Tony Andrews,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-23 15:19:43

Distinto y Grupo Por generalmente hacen el mismo tipo de cosas, para diferentes propósitos... Ambos crean una tabla " de trabajo "en memoria basada en las columnas en las que se agrupan (o se seleccionan en la cláusula Select Distinct) y luego rellenan esa tabla de trabajo mientras la consulta lee los datos, agregando una nueva" fila " solo cuando los valores indican la necesidad de hacerlo...

La única diferencia es que en el Grupo Por hay "columnas" adicionales en la tabla de trabajo para cualquier agregado calculado campos, como Sum(), Count(), Avg(), etc. que la necesidad de actualizar para cada fila original leído. Distinct no tiene que hacer esto... En el caso especial en el que se Agrupa Solo para obtener valores distintos (y no hay columnas agregadas en la salida), entonces es probablemente exactamente el mismo plan de consulta.... Sería interesante revisar el plan de ejecución de la consulta para las dos opciones y ver lo que hizo...

Ciertamente distinto es el camino a seguir para la legibilidad si eso es lo que está haciendo (Cuando su propósito es eliminar filas duplicadas, y no está calculando ninguna columna agregada)

 3
Author: Charles Bretana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-25 16:16:50

Cuando defina concatenación, debe usar un ALIAS para la nueva columna si desea ordenarla combinada con DISTINCT Algunos Ex con 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
 2
Author: rio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-21 14:30:42

Puedes probar una subconsulta:

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
 0
Author: HenryS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-10 10:21:34