在日期时间创建的记录上连接两个记录表 - SQL

Posted

技术标签:

【中文标题】在日期时间创建的记录上连接两个记录表 - SQL【英文标题】:Joining two record tables on record created on date time - SQL 【发布时间】:2021-07-26 12:37:36 【问题描述】:

我正在尝试连接(完全外连接)两个包含客户状态信息的记录或历史表。每条记录都有一个创建记录时的日期时间字段,以及新旧状态。

表 A

ID A CreatedOn A Status OLD A Status NEW
10001 2/05/2021 12:00:00 NULL Hungry
10001 3/05/2021 12:00:00 Hungry Sad

表 B

ID B CreatedOn B Status OLD B Status NEW
10001 2/05/2021 12:00:00 NULL Active
10001 4/05/2021 12:00:00 Active Inactive

我想要的结果是一个记录表,其中包含每个日期时间的所有状态变化。

A CreatedOn A Status OLD A Status NEW B CreatedOn B Status OLD B Status NEW
2/05/2021 12:00:00 NULL Hungry 2/05/2021 12:00:00 NULL Active
3/05/2021 12:00:00 Hungry Sad NULL NULL NULL
NULL NULL NULL 4/05/2021 12:00:00 Active Inactive

然而,我的查询结果返回一个没有表 B 中最后一条记录的表

A CreatedOn A Status OLD A Status NEW B CreatedOn B Status OLD B Status NEW
2/05/2021 12:00:00 NULL Hungry 2/05/2021 12:00:00 NULL Active
3/05/2021 12:00:00 Hungry Sad NULL NULL NULL

我所拥有的并不复杂......但我不知道为什么它不起作用。

SELECT *
FROM  A
FULL OUTER JOIN B
  ON A.A_CreatedOn = B.B_CreatedOn

我的完整查询与此类似

SELECT 
 [A_CreatedOn] 
 ,[Status A OLD]
 ,[Status A NEW]
 ,[B_CreatedOn]
 ,[Status B OLD]
 ,[Status B NEW]      
FROM  A
FULL OUTER JOIN B
  ON A.A_CreatedOn = B.B_CreatedOn
JOIN C
 ON A.ID = C.ID
WHERE C = '10001'

【问题讨论】:

not working 是什么?你的查询结果是什么?两个表中的CreatedOn 日期是否完全相同,直到毫秒? 刚刚编辑了问题。我没有从表 B 中获得最后一条记录 请不要在图片中显示结构和数据。 该查询没有问题。它应该返回预期的结果。见dbfillde。您是否发布了完整的查询? A.ID = C.ID 明确排除 null A.ID 【参考方案1】:
JOIN C
 ON A.ID = C.ID
WHERE C = '10001'

问题应该出在这种情况下。检查此地点的加入条件。

【讨论】:

谢谢。知道了。 JOIN C ON A.ID = C.ID OR B.ID = C.ID WHERE C = '10001' 如果你需要匹配两个表中的ID,为什么不把它放在FULL OUTER JOIN 条件中呢? ON A.A_CreatedOn = B.B_CreatedOn AND A.ID = B.ID【参考方案2】:

问题在于JOIN 条件,因为使用FULL JOIN 您可以在IDTable A 中拥有NULL

你可以使用这个JOIN条件来解决问题

JOIN C ON ISNULL(A.ID, B.ID) = C.ID
WHERE C = '10001'

【讨论】:

以上是关于在日期时间创建的记录上连接两个记录表 - SQL的主要内容,如果未能解决你的问题,请参考以下文章

Oracle/SQL:将日期和时间连接成单个日期值时的数字格式模型无效

组合命名记录列表并跟踪 SQL 中的日期字段

SQL 查询 - 返回连接表的前两条记录的连接

在两个索引表上使用组和连接进行单独 LINQ2SQL 选择与一个组合选择的性能

SQL连接两个SELECT语句的麻烦

如何连接具有不同 GROUP BY 级别的两个查询,使一些记录为空