Sql-Server
SQL Server:從列出其名稱的表中連接所有表
我有一個表,其中包含格式的指標列表及其 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;
給定樣本數據,
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
這個解決方案當然很大程度上依賴於這個假設:
假設所有歷史表中的時間戳對齊,
因此,提供所有時間戳的“錨”表的選擇是任意的。