【问题标题】:Combining two tables without losing column or rows合并两个表而不丢失列或行
【发布时间】:2017-04-10 19:00:14
【问题描述】:

我有两张桌子:

第一个具有列“SomeValue”和“Timestamp”。另一个具有“SomeOtherValue”列和“Timestamp”列。

我需要的输出如下:

一个包含三个列“SomeValue”、“SomeOtherValue”和“Timestamp”的表。

表1中的一行是这样的:[2; 04/07/2017-20:05] 表 2 中的一行是这样的:[5; 04/07/2017-20:05],我希望组合输出行为 [2; 5个; 04/07/2017-20:05].

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

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

我已经尝试过使用 UNION ALL,但它总是会删除一列。 对于我的用例,不可能独立查询两个表。我真的需要一行/对象中的两个值。

我希望有人可以帮助我解决这个问题。谢谢!

【问题讨论】:

  • 添加一些示例表数据和预期的结果 - 以及格式正确的文本。并向我们​​展示您当前的查询尝试。

标签: sql database hana


【解决方案1】:

您所描述的是完全外连接:

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;

【讨论】:

  • 按预期工作。很好,谢谢!我曾想过使用 FULL OUTER JOIN 但不知道该合并功能。
【解决方案2】:

除非您设置日期时间变量并将其值写入两个表,否则加入日期时间戳并不总是可靠的。它可能也不是很有效。
也就是说,假设您想要表 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
;

【讨论】:

  • ISNULL 函数是个好主意,但 LEFT OUTER JOIN 还不够,因为我不仅需要 T1 中的所有值,还需要 T2 中的所有值。所以输出中可能有一些行的第一列是“?”。但如果我使用 FULL OUTER JOIN 我有两个时间戳列或一个时间戳列丢失。
猜你喜欢
  • 2017-09-08
  • 1970-01-01
  • 2016-05-02
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多