合并两个表而不丢失列或行

Combining two tables without losing column or rows

我有两个 table:

第一个有列 "SomeValue" 和 "Timestamp"。另一个有列 "SomeOtherValue" 和 "Timestamp".

我需要的输出如下:

A table 包含三个列 "SomeValue"、"SomeOtherValue" 和 "Timestamp".

table1中的一行是这样的:[2; 04/07/2017-20:05]table 2 中的一行是这样的:[5; 04/07/2017-20:05],我希望合并的输出行是[2; 5; 04/07/2017-20:05].

在那之前,通过简单的连接就可以轻松完成,但我还需要所有其他行。因此,例如,如果我们在 table 1 中有一行,例如 [2; 04/07/2017-20:05] 并且 table 2 中没有匹配的时间戳,输出应该像 [2; ?; 04/07/2017-20:05]。这 '?'代表未定义或空。也可以不连接具有相同时间戳的两行,而是连接两个 table,这样每一行都会有一个带有“?”的空单元格。

我确实意识到我没有在该示例中使用正确的 Date/Time 格式,但假设它在数据库中使用。

我已经尝试过使用 UNION ALL,但它总是删除一列。 对于我的用例,不可能独立查询两个 table。我真的需要一个 row/object.

中的两个值

我希望有人能帮我解决这个问题。谢谢!

加入日期时间戳并不总是可靠,除非您设置日期时间变量并将其值写入两个 table。它可能也不是很有效。
也就是说,假设您想要 table 1 的所有结果并匹配 table 2 结果(如果存在),那么您需要一个左外连接

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

根据 OP 的评论更新 如果您需要来自两个 table 的所有行,那么您可以像上面那样执行 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]
;

或者您可以将第一个查询结果插入 table 变量,然后使用不存在的地方将 T2 行中的任何缺失添加到该 table 变量中,然后 select 输出.

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
;

您所描述的是完全外部联接:

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;