用於唯一電子郵件擷取的DISTINCT 查詢最佳化
當查詢資料庫以從多列擷取資料時,DISTINCT 子句通常用於消除重複行並確保唯一性。但是,在某些情況下,可能需要僅將 DISTINCT 應用於特定列,例如電子郵件地址。
考慮以下查詢:
SELECT ID, Email, ProductName, ProductModel FROM Products;
如果您需要修改此查詢如果查詢僅傳回不同的電子郵件地址,允許其他列中存在重複項,則傳統的DISTINCT 子句可能不夠。相反,您可以採用一種稱為“分區內行編號”的技術。
使用視窗函數進行查詢最佳化
為了達到所需的結果,我們可以在子查詢。在SQL Server 2005 或更高版本中,可以使用以下查詢:
SELECT * FROM ( SELECT ID, Email, ProductName, ProductModel, ROW_NUMBER() OVER(PARTITION BY Email ORDER BY ID DESC) rn FROM Products ) a WHERE rn = 1;
此查詢首先使用視窗函數建立派生表,為每個電子郵件分割區中的每一行指派唯一的行號( rn),從最後一行開始。然後,最外面的查詢過濾派生表以僅包含 rn 值為 1 的行,確保每個唯一電子郵件地址僅包含一行。
過濾範例
此外,您可以將篩選條件合併到子查詢中以進一步細化結果。例如,以下修改後的查詢將結果限制為具有特定型號和名稱且包含特定字串的產品:
SELECT * FROM ( SELECT ID, Email, ProductName, ProductModel, ROW_NUMBER() OVER(PARTITION BY Email ORDER BY ID DESC) rn FROM Products WHERE ProductModel = 2 AND ProductName LIKE 'CYBER%' ) a WHERE rn = 1;
透過利用分區內的視窗函數和行編號,您可以有效地消除重複的電子郵件地址,同時保留其他列的唯一性,從而實現高效靈活的資料檢索。
以上是如何有效地從資料庫中提取唯一的電子郵件地址,同時保留其他列資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!