2017-04-10 34 views
0

我有兩個表:組合兩個表而不丟失列或行

第一個有colums「SomeValue」和「Timestamp」。另一個具有「SomeOtherValue」列和「時間戳」列。

我需要爲輸出什麼是以下幾點:

與三個Colums「someValue中」,「SomeOtherValue」和「時間戳」的表。

當連線在表1是這樣的:[2; 04/07/2017-20:05] and row in 表2就是這樣的:[5; 04/07/2017-20:05],我想組合的輸出行是[2; 5; 04/07/2017-20:05]

直到這一點,它會很容易完成一個簡單的連接,但我也需要所有其他行。因此,例如,如果我們有一排表1[2; 04/07/2017-20:05]表中沒有匹配的時間戳2,輸出結果應該是[2; ?; 04/07/2017-20:05]。 '?'代表未定義或爲空。也可以不加入具有相同時間戳的兩行,而是將兩個表連接在一起,以便每行都有一個帶「?」的空單元格。

我知道我沒有在這個例子中使用正確的日期/時間格式,但假設它在數據庫中使用。

我已經嘗試過使用UNION ALL,但它總是刪除一列。 對於我的用例,不可能獨立查詢兩個表。我真的需要在一行/對象中的兩個值。

我希望有人能幫助我。謝謝!

+1

添加一些示例表數據和預期的結果 - 所有以及格式化文本。並向我們​​展示您當前的查詢嘗試。 – jarlh

回答

2

你所描述的完全外部聯接:

select t1.somevalue, t2.someothervalue, timestamp 
from t1 
full outer join t2 using (timestamp); 

我不知道,但是,無論是SAP HANA支持USING條款。這裏是ON,而不是相同的查詢:

select 
    t1.somevalue, 
    t2.someothervalue, 
    coalesce(t1.timestamp, t2.timestamp) as timestamp 
from t1 
full outer join t2 on t2.timestamp = t1.timestamp; 
+0

正如預期的那樣工作。很好,謝謝!我想過使用FULL OUTER JOIN,但沒有意識到這個聚合函數。 – Bofrostmann

0

加入日期時間戳並不總是可靠,除非您設置日期時間變量並將其值寫入兩個表。這可能不是很有效。
這就是說,假設你希望所有從表1和匹配表2的結果的結果,如果那麼它存在,你需要一個左外連接

Select T1.[SomeValue] 
, ISNULL(T2.[SomeOtherValue], '?') 
, T1.[TimeStamp] 
FROM Table1 T1 
LEFT OUTER JOIN Table2 T2 
ON T2.[TimeStamp] = T1.[TimeStamp] 

更新基於從OP 評論如果你需要的所有行從這兩個表中,你可以按照上面的方式做2個查詢,但是交換T1和T2的位置,然後結合2個查詢。

SELECT T1.[TimeStamp] 
, T1.[SomeValue] 
, ISNULL(T2.[SomeOtherValue], '?') 
FROM Table1 T1 
LEFT OUTER JOIN Table2 T2 
ON T2.[TimeStamp] = T2.[TimeStamp] 
UNION 
SELECT T2.[TimeStamp] 
, T2.[SomeValue] 
, ISNULL(T1.[SomeOtherValue], '?') 
FROM Table2 T2 
LEFT OUTER JOIN Table1 T1 
ON T1.[TimeStamp] = T2.[TimeStamp] 
; 

或者你可以插入第一個查詢結果到一個表變量,然後使用其中不存在,則選擇輸出從T2行添加任何缺少的成表變量。

DECLARE @TempTab TABLE 
([TimeStamp] [datetime] NOT NULL 
, [SomeValue] [nvarchar] (MAX) -- or int if this is always an integer 
, [SomeOtherValue] [nvarchar] (MAX) -- or int if this is always an integer 
) 
; 

INSERT INTO @TempTab 
([TimeStamp] 
, [SomeValue] 
, [SomeOtherValue] 
) 
SELECT T1.[TimeStamp] 
, T1.[SomeValue] 
, ISNULL(T2.[SomeOtherValue], '?') 
FROM Table1 T1 
LEFT OUTER JOIN Table2 T2 
ON T2.[TimeStamp] = T2.[TimeStamp] 
; 

INSERT INTO @TempTab 
([TimeStamp] 
, [SomeValue] 
, [SomeOtherValue] 
) 
SELECT T2.[TimeStamp] 
, T2.[SomeValue] 
, ISNULL(T1.[SomeOtherValue], '?') 
FROM Table2 T2 
LEFT OUTER JOIN Table1 T1 
ON T1.[TimeStamp] = T2.[TimeStamp] 
WHERE NOT EXISTS 
( SELECT 1 
    FROM @TempTab T 
    WHERE T.[TimeStamp] = T2.[TimeStamp] 
) 
; 

SELECT T.[TimeStamp] 
, T.[SomeValue] 
, T.[SomeOtherValue] 
FROM @TempTab T 
; 
+0

ISNULL函數是一個gead想法,但是LEFT OUTER JOIN不夠,因爲我不僅需要來自T1的所有值,還需要來自T2的所有值。所以在第一列是'?'的輸出中可能會有一些行。但是,如果我使用FULL OUTER JOIN,我有兩個時間戳列或一個時間戳列丟失。 – Bofrostmann