Query

SQL 中的備份值列表

  • October 30, 2018

我的問題是什麼是處理儲存值列表的最佳方法,其中下一個用作備份。具有完全可變數量的備份(由我們的使用者指定)。

我知道在一個 SQL 欄位中儲存分隔列表被認為是一種反模式(例如參數列表),但是在這種情況下,我們有一個文件夾名稱,如果該文件夾名稱不存在,我們將退回到另一個指定的文件夾名稱,依此類推,直到用盡所有給定的文件夾名稱或找到第一個工作文件夾名稱。

嘗試的文件夾名稱的順序也很重要,必須保留。不能讓它在 8 點之前檢查 99。

我能想到的最簡單的解決方案是簡單地有一個folders包含兩列的表:folderpriority. 簡單地

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;

結果:

在此處輸入圖像描述

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