2010-12-02 18 views
5

No puedo entender por qué esto no funciona:SQL Orden de encargo Por

select distinct a.QuestionID,a.QuestionName,b.AnswerID,b.AnswerName 
    from @TempExportList a 
    join tblAnswers b 
    on a.QuestionID = b.QuestionID 
    where [email protected] 
    order by (case when a.QuestionName='A' then 0 
        when a.QuestionName='B' then 1 
        else a.QuestionID 
       end) 

me sale el siguiente error -

elementos ORDER BY deben aparecer en la lista de selección si SELECT DISTINCT es especificado.

Pero esto funciona bien:

select distinct a.QuestionID,a.QuestionName,b.AnswerID,b.AnswerName 
    from @TempExportList a 
    join tblAnswers b 
    on a.QuestionID = b.QuestionID 
    where [email protected] 
    order by a.QuestionID 

Respuesta

8

El mensaje de error explica perfectamente el problema. En el primer ejemplo, el elemento ORDER BY - CASE WHEN ... END - no aparece en la lista SELECT. En el segundo ejemplo, ORDER BY artículo - a.QuestionID - aparece en la lista SELECT.

para fijar el primer ejemplo que necesita para hacer algo como esto:

SELECT DISTINCT a.QuestionID, a.QuestionName, b.AnswerID, b.AnswerName, 
       CASE WHEN a.QuestionName = 'A' THEN 0 
        WHEN a.QuestionName = 'B' THEN 1 
        ELSE a.QuestionID 
       END 
FROM @TempExportList AS a 
    JOIN tblAnswers AS b 
     ON a.QuestionID = b.QuestionID 
WHERE a.PaperID = @PaperID 
ORDER BY CASE WHEN a.QuestionName = 'A' THEN 0 
       WHEN a.QuestionName = 'B' THEN 1 
       ELSE a.QuestionID 
     END 
+0

Gracias. Hubiera pensado que se estaba refiriendo a a.QuestionName y a.QuestionID no estando en la selección, con 0,1 ... n solo siendo un número de pedido y no necesarios como parte de la selección. – Bob

+0

Gracias. El error es claro, pero pensé que solo se deben agregar columnas. Para mí, SQL puede ser bastante simple y muy confuso al mismo tiempo -_- – ErTR

2

yo habría pensado que el mensaje de auto explanitory.

Ha seleccionado un distinct en a.QuestionID, a.QuestionName, b.AnswerIDID y b.AnswerName. Por lo tanto, podría haber filas de datos con los mismos valores respectivos para cada uno de estos campos, pero uno diferente para su declaración case.

consideran este

a.QuestionID a.QuestionName b.AnswerID b.AnswerName [case statement] 

1    'One'   2   'Two'   0 
1    'One'   2   'Two'   1 

¿Cómo sabe el valor de consulta que en la última columna a utilizar en el orden? ¿Es 0? Es 1? Simplemente, no puede determinar, por lo que no puede usarlo, de ahí el error.

El segundo ejemplo está bien, porque a.QuestionID aparece en la lista SELECT, y la consulta puede aplicar felizmente el pedido.

+1

Este es un argumento falso de la OMI. ** Podría ** determinar que solo se estaban utilizando funciones determinísticas y que la expresión de casos solo estaba en el orden por columnas usadas en la lista de selección. SQL Server 2000 te permite hacer esto. AFAIK fue un cambio radical en SQL Server 2005 para cumplir con el estándar ANSI. –

4

Usted puede evitar esto con un CTE

;WITH T AS 
(
SELECT DISTINCT a.QuestionID,a.QuestionName,b.AnswerID,b.AnswerName 
    FROM @TempExportList a 
    JOIN tblAnswers b 
    ON a.QuestionID = b.QuestionID 
    WHERE [email protected] 
) 
SELECT * 
FROM  T 
ORDER BY 
     CASE 
        WHEN QuestionName='A' 
        THEN 0 
        WHEN QuestionName='B' 
        THEN 1 
        ELSE QuestionID 
     END