Sql-Server

SQL Server:從列出其名稱的表中連接所有表

  • July 17, 2019

我有一個表,其中包含格式的指標列表及其 ID:

L6Metrics
| ID   | Name            |
--------------------------
| 734  | L6A_Velocity    |
| 736  | L6B_Velocity    |
| 738  | L6A_Target_Rate |
...

這些指標中的每一個都有自己的對應表,其中包含帶時間戳的歷史數據。如果度量有 ID X,那麼它的歷史數據的表名是History_tX。這些歷史表具有以下格式:

History_t734
| DateTime                       | Value |
-----------------------------------------
| 2018-05-04 19:17:41.972 -05:00 | 33.9  |
| 2018-05-04 19:17:51.972 -05:00 | 36.3  |
| 2018-05-04 19:18:01.972 -05:00 | 35.1  |
...

假設所有歷史記錄表中的時間戳對齊,我如何使用該L6Metrics表來連接所有歷史記錄表DateTime以獲得以下資訊:

| DateTime                       | History_t734 | History_t736 | ...
---------------------------------------------------------------- 
| 2018-05-04 19:17:41.972 -05:00 | 33.9         | 34.9         |
| 2018-05-04 19:17:51.972 -05:00 | 36.3         | 37.4         |
| 2018-05-04 19:18:01.972 -05:00 | 35.1         | 36.5         |
...

有 75 行L6Metrics(代表 75 個歷史表),所以我的結果中有 76 列。如果需要,我有能力進行修改L6Metrics

雖然我非常同意Lennart 的評論

然後我建議將它們合併為 1 並為 type 添加一個屬性

…我知道我們並不總是有一根魔杖來修復別人的(壞的)設計。所以我會選擇動態 SQL 方法:

DECLARE @sqlcol nvarchar(max) = N'SELECT t0.DateTime', @sqljoin nvarchar(max) = N'';

;WITH tnames AS (SELECT t = N'History_t' + CONVERT(varchar(11),ID),
 rn = ROW_NUMBER() OVER (ORDER BY ID) FROM dbo.L6Metrics)
SELECT @sqlcol += N',
' + t + N' = ' + t + N'.Value', 
 @sqljoin += CASE WHEN rn = 1 THEN N'
 FROM dbo.' + t + N' AS t0' ELSE N'
 LEFT OUTER JOIN dbo.' + t
 + N' ON t0.DateTime = ' + t + N'.DateTime' END
FROM tnames;

PRINT @sqlcol;
PRINT @sqljoin; 

-- when the PRINT output looks right, uncomment these:

-- SET @sqlcol += @sqljoin;
-- EXEC sys.sp_executesql @sqlcol;

給定樣本數據,PRINT輸出結果為:

SELECT t0.DateTime,
History_t734 = History_t734.Value,
History_t736 = History_t736.Value,
History_t738 = History_t738.Value

 FROM dbo.History_t734 AS t0
 LEFT OUTER JOIN dbo.History_t736 ON t0.DateTime = History_t736.DateTime
 LEFT OUTER JOIN dbo.History_t738 ON t0.DateTime = History_t738.DateTime

這個解決方案當然很大程度上依賴於這個假設:

假設所有歷史表中的時間戳對齊,

因此,提供所有時間戳的“錨”表的選擇是任意的。

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