Sql-Server

如何使用 DISTINCT 命令保持行排序或如何添加行號以交叉應用

  • December 29, 2015

我有一個問題,即變數列的順序方向不同後發生變化。

這是範例

數據源

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;

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