[英]Combining two tables without losing column or rows
我有两个表:
第一个具有列“ SomeValue”和“ Timestamp”。 另一个具有“ SomeOtherValue”列和“ Timestamp”列。
我需要的输出如下:
具有三个列“ SomeValue”,“ SomeOtherValue”和“ Timestamp”的表。
当表1中的行是这样的时: [2; [2017年4月7日至20:05] , 表2中的一行如下: [5; 04/07 / 2017-20:05] ,我希望合并的输出行为[2; 5; 04/07 / 2017-20:05] 。
在此之前,使用简单的连接就可以轻松完成,但是我还需要所有其他行。 例如,如果我们在表1中有一行[2; 并且表2中没有匹配的时间戳,输出应类似于[2; 04/04 / 2017-20:05] 。 ?; 04/07 / 2017-20:05] 。 '?' 代表undefined或null。 也可以不将具有相同时间戳的两行连接在一起,而是将两个表都隐藏起来,以便每一行都将有一个带'?'的空单元格。
我确实意识到在该示例中我没有在此处使用正确的日期/时间格式,但是假定它已在数据库中使用。
我已经尝试使用UNION ALL,但是它总是删除一列。 对于我的用例,不可能独立查询两个表。 我确实需要在一行/对象中同时使用两个值。
我希望有人可以帮助我。 谢谢!
您所描述的是完全外部联接:
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的所有结果以及匹配表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
;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.