Sql-Server
如何使用 DISTINCT 命令保持行排序或如何添加行號以交叉應用
我有一個問題,即變數列的順序方向不同後發生變化。
這是範例
數據源
DECLARE @Table TABLE ( FirstName NVARCHAR(255), LastName NVARCHAR(255), Variable1 NVARCHAR(255), Variable2 NVARCHAR(255), Variable3 NVARCHAR(255) ) INSERT INTO @Table VALUES ('FirstName 1','LastName 1', 'D', 'B','A'), ('FirstName 1','LastName 1', 'D', 'C','A'), ('FirstName 2','LastName 2', 'A', 'B','C')
首先選擇正確的順序(順序由交叉應用順序完成)
/* Ordering is okay, but table containts duplicates */ SELECT FirstName, LastName, v.VariableName, v.Value FROM @Table CROSS APPLY ( VALUES ('Variable1',Variable1), ('Variable2',Variable2), ('Variable3',Variable3) ) AS v(VariableName, Value)
第二次選擇由 Distinct 命令重新排序
/* Ordering is okay, but table containts duplicates */ SELECT DISTINCT FirstName, LastName, v.VariableName, v.Value FROM @Table CROSS APPLY ( VALUES ('Variable1',Variable1), ('Variable2',Variable2), ('Variable3',Variable3) ) AS v(VariableName, Value)
我想要的是
我需要第二次選擇,但需要交叉應用順序。我想過為每個人添加行號,但我不知道該怎麼做
“交叉應用序列”是指在程式碼中按交叉應用順序排序(按語法排序)。我不知道如何更好地描述它,因此我附上了一張圖片。
即使您是第一次查詢,也無法保證輸出順序。除非通過
ORDER BY
子句要求特定的順序,否則數據庫可以按照它認為合適的任何順序自由地將結果交給您。對於可以使用索引的簡單查詢,它可能看起來順序是有保證的,因為輸出將按照索引用作主要搜尋/掃描的順序,但對於比單個表選擇更複雜的任何事情,都會有至少有兩種方法可以做到這一點,查詢計劃者選擇的一種方法可能會隨著表中數據平衡的變化而變化。如果你想要一個特定的順序,你必須在一個
ORDER BY
子句中指定它。在您的這種情況下,這
ORDER BY FirstName, LastName, VariableName, Value
似乎是您想要的。你沒有提到關心是否
Value
有任何特定的順序。如果您不關心這一點,那麼請ORDER BY FirstName, LastName, VariableName
改為以防萬一引擎需要做額外的工作來強制執行額外的訂購細節。在您的範例數據中,這意味著行 FN1/LN1/V2/B 和 FN1/LN1/V2/C 將以任意順序出現(即有時 B 將是第一個,有時 C 會)。
不確定我在這裡得到你想要的,但可能是你可以在表表達式中使用排序順序值,然後在 order by 子句中使用它。
SELECT DISTINCT t.FirstName, t.LastName, v.VariableName, v.Value, v.Sortorder FROM @Table as t CROSS APPLY ( VALUES ('Variable1', t.Variable1, 1), ('Variable3', t.Variable3, 2), ('Variable2', t.Variable2, 3) ) AS v(VariableName, Value, Sortorder) ORDER BY t.FirstName, t.LastName, v.Sortorder;