2013-12-13 53 views
1

比如我有很多表都[VV1][VV2]有:如何通過合併時間列將兩個列表合併爲一個列表?

[TimeStamp][V1]

2013-12-12 07:00:00.000 3628460,75 
2013-12-12 09:00:00.000 3628460,75 
2013-12-12 10:00:00.000 3628460,75 
2013-12-12 11:00:00.000 3628460,75 
2013-12-12 06:00:00.000 3628460,75 

[TimeStamp][V2]

2013-12-12 07:00:00.000 3628460,75 
2013-12-12 09:00:00.000 3628460,75 
2013-12-12 10:00:00.000 3628460,75 
2013-12-12 06:00:00.000 3628460,75 

,我想要得到的東西一樣:

2013-12-12 07:00:00.000 3628460,75 3628460,75 
2013-12-12 08:00:00.000 NULL  3628460,75 
2013-12-12 09:00:00.000 3628460,75 3628460,75 
2013-12-12 10:00:00.000 3628460,75 3628460,75 
2013-12-12 11:00:00.000 3628460,75 NULL 
2013-12-12 06:00:00.000 3628460,75 3628460,75 

我試着與聯接和我的變種實在太可怕了實現它:

select distinct DATEADD(second, DATEDIFF(second, GETUTCDATE(), GETDATE()), coalesce(VV1.[TimeStamp], VV2.[TimeStamp])) as Date, V1, V2 
from vv1 
full join vv2 
on vv2.TimeStamp = vv1.TimeStamp 

(DATEDD是UTC本地時間)

有人想到那是因爲表數是動態的,每次當我添加新表並想要查看新列我可以輕鬆編輯選擇的字符串。

但因爲填充雙,並與多個列,它只是去瘋狂和獨特的是骯髒的黑客合併這個變化是可怕的......

現在回想健全和快速的實現......如何使它?

+0

你說的'variant'是什麼意思? – bendataclear

+0

@bendataclear我的意思是我的嘗試或我的版本或我的錯誤代碼 – Cynede

+0

你有時間戳列上的索引嗎?它可能有助於加速執行FULL JOIN。 – semao

回答

1

我不認爲會有性能更好的解決方案,但下面的查詢可能是做這件事的更合適的方法,尤其是在增加新表:

select [Date] 
    , MAX([Value1]) as [Value1] 
    , MAX([Value2]) as [Value2] 

from (
    select DATEADD(second, DATEDIFF(second, GETUTCDATE(), GETDATE()), VV1.[TimeStamp]) as [Date] 
     , V1 as [Value1] 
     , Null as [Value2] 
    from vv1 

    UNION ALL 

    select DATEADD(second, DATEDIFF(second, GETUTCDATE(), GETDATE()), VV2.[TimeStamp]) as [Date] 
     , Null as [Value1] 
     , V2 as [Value2] 
    from vv2) subquery 

group by subquery.date 
+0

我在這裏不喜歡的是,我需要在每個聯合部分中指定',Null作爲[Value2]'事物。如果會有10列,我將需要添加新的,這將是非常困難的。 – Cynede

+0

但肯定這個解決方案比我的 – Cynede

+0

好得多如果有可能不會重複'Null as [VX]'這將是理想的方法:( – Cynede