合并两个表而不丢失列或行
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;
我有两个 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;