我有一個使用 SQL Server 后端的 Access 資料庫,并且我撰寫了一個查詢,該查詢Panels按列對表中的條目進行排名AgreementID,使用PanelID主鍵來確定排名。
MS Access 中的查詢是這樣的:
SELECT
X.AgreementID, X.PanelID, X.Panel_TypeID,
((SELECT COUNT(*)
FROM Panels
WHERE (PanelID < X.PanelID)
AND (AgreementID = X.AgreementID);) 1) AS Rank
FROM
Panels AS X
WHERE
(((X.AgreementID) IS NOT NULL))
ORDER BY
X.AgreementID, X.PanelID;
輸出如下所示:

如您所見,與 相關的每個條目AgreementID都根據其PanelID.
我遇到的問題是有 20k 行并且在 Access 中運行需要很長時間,所以我希望在后端重新創建它,希望它比在前端使用鏈接表運行得更快。
SQL Server 似乎不支持上面的方法,所以我需要一些指標來幫助我解決這個問題。
uj5u.com熱心網友回復:
您可以在 SQL Server 中使用子查詢。但是有更好的方法來做到這一點。
您可以使用行編號功能。
SELECT
p.AgreementID,
p.PanelID,
p.Panel_TypeID,
ROW_NUMBER() OVER (PARTITION BY p.AgreementID ORDER BY p.PanelID) AS Rank
FROM
Panels p
WHERE
p.AgreementID IS NOT NULL
ORDER BY
p.AgreementID,
p.PanelID
;
其邏輯略有不同,因為它只會計算非空行。如果你想先計算所有行,那么你需要這個:
SELECT
p.AgreementID,
p.PanelID,
p.Panel_TypeID,
p.Rank
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY p.AgreementID ORDER BY p.PanelID) AS Rank
FROM
Panels p
) p
WHERE
p.AgreementID IS NOT NULL
ORDER BY
p.AgreementID,
p.PanelID
;
為了使這些查詢有效地執行,您將需要一個索引。
聚集索引
Panels (AgreementID, PanelID)
或包含列的非聚集索引
Panels (AgreementID, PanelID) INCLUDE (Panel_TypeID)
uj5u.com熱心網友回復:
像這樣運行一個簡單的子查詢應該可以在 SQL Server 中正常作業。假設您的后端表與您的 Access 表具有相同的架構,請嘗試洗掉一些括號并運行相同的查詢:
SELECT
X.AgreementID,
X.PanelID,
X.Panel_TypeID,
(
SELECT
COUNT(*)
FROM
Panels
WHERE
PanelID < X.PanelID
AND AgreementID = X.AgreementID
) 1 AS Rank
FROM
Panels X
WHERE
X.AgreementID IS NOT NULL
ORDER BY
X.AgreementID,
X.PanelID
;
uj5u.com熱心網友回復:
如果您不想擺弄 T-SQL 和傳遞查詢,可以使用我在此處RowNumber找到的函式。
然后可以將查詢簡化為:
SELECT
AgreementID,
PanelID,
Panel_TypeID,
RowNumber(CStr([PanelID]), CStr([AgreementID])) AS Rank
FROM
Panels
WHERE
AgreementID IS NOT NULL
ORDER BY
AgreementID,
PanelID
由于資料被快取,它應該運行得非常快。
GitHub 上的完整檔案:VBA.RowNumbers。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/514541.html
上一篇:訪問查詢以按百分比提高欄位值?
