Query
SQL 中的備份值列表
我的問題是什麼是處理儲存值列表的最佳方法,其中下一個用作備份。具有完全可變數量的備份(由我們的使用者指定)。
我知道在一個 SQL 欄位中儲存分隔列表被認為是一種反模式(例如參數列表),但是在這種情況下,我們有一個文件夾名稱,如果該文件夾名稱不存在,我們將退回到另一個指定的文件夾名稱,依此類推,直到用盡所有給定的文件夾名稱或找到第一個工作文件夾名稱。
嘗試的文件夾名稱的順序也很重要,必須保留。不能讓它在 8 點之前檢查 99。
我能想到的最簡單的解決方案是簡單地有一個
folders
包含兩列的表:folder
和priority
. 簡單地select folder from folders order by priority;
然後按順序嘗試它們並使用作為物理目錄存在的第一個文件夾。
如果
folder
在您目前的模型中是一個屬性,則將該表設為該folders
表的子表;即,如果您目前的模型是:x ( id, col1, col2, folder )
那麼你應該把它變成:
x ( id, col1, col2 ) folders ( x_id references x, folder, priority )
查詢變為:
select folder from folders where x_id = <id> order by priority;
可以使用帶有遞歸 CTE 的自引用表來提供可管理的文件夾列表,以及無限的備份文件夾,類似於:
CREATE TABLE dbo.FallbackFolders ( FolderID INT NOT NULL CONSTRAINT PK_FallbackFolders PRIMARY KEY CLUSTERED IDENTITY(1,1) , FolderName VARCHAR(255) NOT NULL , ParentFolderID INT NULL CONSTRAINT FK_FallbackFolders_FolderID FOREIGN KEY REFERENCES FallbackFolders(FolderID) ); INSERT INTO dbo.FallbackFolders (FolderName, ParentFolderID) VALUES ('C:\',NULL); INSERT INTO dbo.FallbackFolders (FolderName, ParentFolderID) VALUES ('C:\Test\',1); INSERT INTO dbo.FallbackFolders (FolderName, ParentFolderID) VALUES ('C:\Test\Test2',2); INSERT INTO dbo.FallbackFolders (FolderName, ParentFolderID) VALUES ('D:\',NULL); INSERT INTO dbo.FallbackFolders (FolderName, ParentFolderID) VALUES ('D:\Test\',4); INSERT INTO dbo.FallbackFolders (FolderName, ParentFolderID) VALUES ('D:\Test\Test2',5); SELECT * FROM dbo.FallbackFolders ;WITH Folders (ParentFolderID, FolderName) AS ( SELECT F.ParentFolderID, F.FolderName FROM dbo.FallbackFolders F UNION ALL SELECT F1.FolderID, F1.FolderName FROM dbo.FallbackFolders F1 INNER JOIN Folders ON F1.ParentFolderID = Folders.ParentFolderID ) SELECT Folders.FolderName, F.FolderName AS FallbackFolderName FROM Folders LEFT JOIN dbo.FallbackFolders F ON Folders.ParentFolderID = F.FolderID WHERE (F.FolderName IS NULL OR Folders.FolderName <> F.FolderName) ORDER BY F.FolderID DESC;
結果: