none
Sql 2014 - ORDER BY items must appear in the select list if SELECT DISTINCT is specified. RRS feed

  • Domanda

  • Quando eseguo questa query in SQL 2014:

     

    BEGIN TRAN

    IF OBJECT_ID('dbo.TestTable') IS NOT NULL DROP TABLE dbo.TestTable;

    create table TestTable
    (colId VARCHAR(10) primary key clustered, 
    colText1 varchar(20),
    colText2 varchar(20))


    SELECT DISTINCT colId AS [ID],
    colText1 AS [col1],
                    colText2 AS [col2],
                    colText1 + colText2  AS [Campo1]
    FROM TestTable
    GROUP BY
       colId,
    colText1,
    colText2,
    colText1 + colText2
    ORDER BY [campo1]


    ROLLBACK

    mi viene restituito il seguente errore:

    ORDER BY items must appear in the select list if SELECT DISTINCT is specified.

    Con le versioni precedente di SQL non si verifica.

    Inoltre se rimuovo la colonna ColText1 o ColText2, l'errore non si verifica e la query viene eseguita con successo

    Secondo voi è un errore di SQL Server 2014 ?

    lunedì 13 aprile 2015 08:57

Tutte le risposte

  • Ciao GianniRusso.

    Io non rilevo quanto da te riferito.

    L'errore che descrivi si verifica, nello scenario che descrivi, se il campo (o i campi) presenti nella clausola ORDER BY non sono presenti anche nella SELECT.

    Ma,, come ti ho detto, non è il caso della tua query e io l'ho eseguita senza errori.


    vibi6


    PS: Ovviamente ho testato su SQL Server 2014.
    • Modificato vibi6 lunedì 13 aprile 2015 11:13
    lunedì 13 aprile 2015 11:11
  • Ciao.

    Ho riprovato la tua query su un diverso motore Sql Server sempre 2014 e ho ottenuto il tuo stesso errore.

    Magari domani, tempo permettendo, rifaccio un giro completo e confronto le due installazioni di Sql server.

    Commentando, però, la clausola GROUP BY l'errore non si verifica.

    Se comunque ti preme far funzionare la tua query ti consiglio di trasformare il tuo codice in una subquery, così:

    SELECT 
    	T.* 
    FROM
    (
    	SELECT DISTINCT
    		colId
    		, colText1
    		, colText2
    		, (colText1 + colText2) AS C
    	FROM 
    		TestTable
    	GROUP BY
    	   colId
    	   , colText1
    	   , colText2
    	   ,  (colText1 + colText2) 
    ) AS T
    ORDER BY
       colId
       , colText1
       , colText2
       ,  C
    

    vibi6

    lunedì 13 aprile 2015 19:42
  • Ciao.

    Confermo quanto detto nel precedente post.

    Su due  PC x64 con SQL Server 2014, uno di essi esegue correttamente la tua query e l'altro ritorna l'errore da te segnalato.

    Le due installazioni mi pare uguali e non mi so spiegare la cosa.

    Ti segnalo che se la colonna calcolata [campo1] nella SELECT la scrivi così:

    ISNULL(colText1 + colText2, '')  AS [Campo1]

    l'errore non si verifica più.

    Magari sentiamo altri sull'argomento.

    Ciao.


    vibi6

    martedì 14 aprile 2015 18:17
  • Aggiungo quest'altra considerazione.

    Se io modifico nella tua query la sola GROUP BY nel modo seguente, che dovrebbe essere del tutto equivalente, NON ottengo nessun errore.

    GROUP BY
       colId,
    colText1,
    colText2,
    ISNULL(colText1, colText1) + colText2
    Puoi verificare se vale anche per la tua installazione?


    vibi6

    martedì 14 aprile 2015 21:22
  • Ciao, perchè hai bisogno di raggruppare per ColText1 + ColText2 ?

    con la query scritta in questo modo dovresti ottenere comunque il tuo risultato

    SELECT DISTINCT colId AS [ID],
    				colText1 AS [col1],
                    colText2 AS [col2],
                    colText1 + colText2 AS [Campo1]
    FROM TestTable
    GROUP BY
       colId,
    	colText1,
    	colText2
    	--,colText1 + colText2
    ORDER BY [campo1]


    Please mark this reply as answer if it solved your issue or vote as helpful if it helped so that other forum members can benefit from it

    mercoledì 15 aprile 2015 07:56
  • Ciao, perchè hai bisogno di raggruppare per ColText1 + ColText2 ?

    con la query scritta in questo modo dovresti ottenere comunque il tuo risultato

    SELECT DISTINCT colId AS [ID],
    				colText1 AS [col1],
                    colText2 AS [col2],
                    colText1 + colText2 AS [Campo1]
    FROM TestTable
    GROUP BY
       colId,
    	colText1,
    	colText2
    	--,colText1 + colText2
    ORDER BY [campo1]


    Please mark this reply as answer if it solved your issue or vote as helpful if it helped so that other forum members can benefit from it

    Ciao.

    Mi permetto io di rispondere, perché qui non è questione di ciò che sia meglio scrivere per ottenere un risultato, ma del perché su una installazione 2014 esce l'errore citato e su un'altra no.

    Converrai con me che scrivere ISNULL(colText1, colText1) è la stessa cosa che scrivere colText1, ma tant'è che mettendo nella Group by la prima espressione l'errore non si verifica mentre nel secondo si.

    Evidentemente si tratta di un bug.


    vibi6

    mercoledì 15 aprile 2015 10:09
  • Ciao, perchè hai bisogno di raggruppare per ColText1 + ColText2 ?

    con la query scritta in questo modo dovresti ottenere comunque il tuo risultato

    SELECT DISTINCT colId AS [ID],
    				colText1 AS [col1],
                    colText2 AS [col2],
                    colText1 + colText2 AS [Campo1]
    FROM TestTable
    GROUP BY
       colId,
    	colText1,
    	colText2
    	--,colText1 + colText2
    ORDER BY [campo1]


    Please mark this reply as answer if it solved your issue or vote as helpful if it helped so that other forum members can benefit from it

    Ciao.

    Mi permetto io di rispondere, perché qui non è questione di ciò che sia meglio scrivere per ottenere un risultato, ma del perché su una installazione 2014 esce l'errore citato e su un'altra no.

    Converrai con me che scrivere ISNULL(colText1, colText1) è la stessa cosa che scrivere colText1, ma tant'è che mettendo nella Group by la prima espressione l'errore non si verifica mentre nel secondo si.

    Evidentemente si tratta di un bug.


    vibi6

    Su documentazione ufficiale si riporta quanto segue

    However, when DISTINCT is specified, you are restricted in the ORDER BY list only to elements that
    appear in the SELECT list. The reasoning behind this restriction is that when DISTINCT is specified, a
    single result row might represent multiple source rows; therefore, it might not be clear which of the
    multiple possible values in the ORDER BY expression should be used. Consider the following invalid
    query.
    SELECT DISTINCT country
    FROM HR.Employees
    ORDER BY empid;
    There are nine employees in the Employees table—five from the United States and four from the
    United Kingdom. If you omit the invalid ORDER BY clause from this query, you get two rows back—
    one for each distinct country. Because each country appears in multiple rows in the source table, and
    each such row has a different employee ID, the meaning of ORDER BY empid is not really defined.

    Risolverei in questo modo

    SELECT distinct  
    		colId AS [ID],
    		colText1 AS [col1],
                    colText2 AS [col2],
    		--colText1 + colText2 AS [Campo1] ,
    		min([colText1] + [colText2]) as newCol  --<<<< inserire una funzione di aggregazione
    FROM TestTable
    GROUP BY
       colId,
    	colText1,
    	colText2,
    	[colText1] + [colText2]
    ORDER BY min([colText1] + [colText2])

    la potrebbe essere riconducibile a questo "bug?" noto

    https://connect.microsoft.com/SQLServer/Feedback/Details/84522

    aggiungo inoltre che la query originale su SQL Server 2008 R2 funziona correttamente.


    Please mark this reply as answer if it solved your issue or vote as helpful if it helped so that other forum members can benefit from it




    mercoledì 15 aprile 2015 13:22