Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 合并两个表而不丢失列或行_Sql_Database_Hana - Fatal编程技术网

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

Sql 合并两个表而不丢失列或行,sql,database,hana,Sql,Database,Hana,我有两张桌子: 第一个具有列“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] 在这之前,通过简单的连接很容易完成,但我还需要所有

我有两张桌子:

第一个具有列“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]

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

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

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


我希望有人能帮我。谢谢大家!

除非设置datetime变量并将其值写入两个表,否则连接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的评论进行更新 如果您需要这两个表中的所有行,那么您可以像上面那样执行两个查询,但交换T1和T2位置,然后合并这两个查询

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
;

除非设置datetime变量并将其值写入两个表,否则连接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的评论进行更新 如果您需要这两个表中的所有行,那么您可以像上面那样执行两个查询,但交换T1和T2位置,然后合并这两个查询

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
;

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

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;

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

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;

添加一些示例表数据和预期结果-所有这些都是格式良好的文本。并向我们展示您当前的查询尝试。添加一些示例表数据和预期结果-所有内容以及格式良好的文本。并向我们展示您当前的查询尝试。ISNULL函数是一个gead想法,但左外部联接不够,因为我不仅需要T1中的所有值,还需要T2中的所有值。因此,输出中可能有一些行,其中第一列是“?”。但如果我使用完全外部连接,我有两个时间戳列,或者一个时间戳列丢失。ISNULL函数是gead的想法,但左外部连接是不够的,因为我不仅需要T1的所有值,还需要T2的所有值。因此,输出中可能有一些行,其中第一列是“?”。但是如果我使用完全外部连接,我有两个时间戳列,或者一个时间戳列丢失。这就像预期的一样。太好了,谢谢!我曾想过使用一个完整的外部连接,但没有意识到这个合并函数。它的工作原理和预期的一样。太好了,谢谢!我曾想过使用一个完整的外部连接,但没有意识到合并函数。