Sql-Server

如果指定了 SELECT DISTINCT,則 ORDER BY 項目必須出現在選擇列表中

  • February 29, 2020
SELECT DISTINCT *
   FROM (
       SELECT a.Title, a.ID FROM TableA a
       LEFT JOIN TableB b 
       ON a.ID = b.XID) c
   ORDER BY 
       CASE WHEN c.ID > 10 THEN c.Title
       ELSE c.ID
       END
   ASC

如果我移動DISTINCT到嵌套選擇,那麼兩者IDTitle應該是相同的類型,例如:INT,但它們不是。

ID和都Title在選定的列中,有什麼問題?

此外,此更改CASE WHEN 1 <> 1查詢執行沒有問題。

真正的問題是由數據類型轉換引起的。如果將此表達式添加到選擇列表中:

CASE WHEN c.ID > 10 THEN c.Title
       ELSE c.ID
       END

你會看到另一個錯誤。類似於:“將 nvarchar 值 ‘Some title’ 轉換為數據類型 int 時轉換失敗”。當您將 varchar 與 int 值進行比較時,根據數據類型優先級(SQL Server 需要將 Title 與 ID 進行比較以對最終結果集進行排序)varchar 應轉換為 int,因為 int 具有更高的優先級。

https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-type-precedence-transact-sql?view=sql-server-ver15

引用自:https://dba.stackexchange.com/questions/260890