我有两张桌子:
第一个有colums" SomeValue"和"时间戳"。另一个有列" SomeOtherValue"还有"时间戳"。
我需要的输出如下:
包含三个Colums" SomeValue"," SomeOtherValue"和"时间戳"。
表1 中的行如下所示: [2; 04/07 / 2017-20:05] 和表2 中的一行是这样的: [5; 04/07 / 2017-20:05] ,我希望合并的输出行是 [2; 5; 4月7日/ 2017-20:05]
在此之前,通过简单的连接可以轻松完成,但我还需要所有其他行。例如,如果我们在表1中有一行,如 [2; 04/07 / 2017-20:05] 并且表2 中没有匹配的时间戳,输出应该像 [2; ?; 4月7日/ 2017-20:05] 。 '?'代表undefined或null。也可以不使用相同的时间戳连接两行,而是将两个表连接起来,这样每一行都会有一个空单元格,并且'?'。
我确实意识到我在这个例子中没有使用正确的日期/时间格式,但是假设它在数据库中使用。
我已经尝试过使用UNION ALL,但它总是删除一列。 对于我的用例,无法独立查询两个表。我真的需要一行/对象中的两个值。
我希望有人可以帮助我。谢谢!
答案 0 :(得分: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;
答案 1 :(得分:0)
除非您设置datetime变量并将其值写入两个表,否则加入日期时间戳并不总是可靠的。它也许效率不高。
也就是说,假设您希望表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]
;
或者您可以将第一个查询结果插入表变量,然后使用where not exists将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
;