首页 > 解决方案 > 我有两个表我需要一个查询来组合这两个表并按键 A、键 B、键 C、日期、时间对它们进行排序

问题描述

我在SQL DB中有两个表。它们都包含 3 个匹配的列,以及每个具有不同信息的附加列。我想编写一个根据日期/时间戳将它们交错的查询。表 A 适用于每 10 分钟运行一次并取样的机器。表 B 是操作员进行调整、打开/关闭机器等时记录条目的日志文件。

我使用了以下查询,但它在表 A 上给了我重复项。我这样做where(BatchTable.Batch = 'HB20419' and EventLogTable.Batch = 'HB20419')只是为了减少返回的日期数量,直到我弄清楚查询。一个复杂的问题是每个表都有自己的日期/时间列,它们的名称不同并且彼此完全独立。

SELECT BatchTable.Asset_Number,BatchTable.Recipe,BatchTable.Batch,BatchTable.Group_No, BatchTable.Sample_No, BatchTable.SampleDate, BatchTable.SampleTime, BatchTable.Weight, EventLogTable.EvtTime, EventLogTable.EvtValueBefore, EventLogTable.EvtValueAfter, EventLogTable.EvtComment
FROM BatchTable,EventLogTable
where(BatchTable.Batch = 'HB20419' and EventLogTable.Batch = 'HB20419')
order by Asset_Number, Recipe, Batch, Group_No, Sample_No ASC

标签: sql-server

解决方案


我必须编写一些示例数据,但听起来您想将这两个表合并在一起以“交错”它们。您可以通过为列名取别名以匹配并从对面表中为最终值选择空值来做到这一点。我承认我在某种程度上猜测了你想要的结果。

制作一些示例数据:

DECLARE @batch table (SampleDate VARCHAR(MAX), SampleTime VARCHAR(MAX), Recipe 
VARCHAR(MAX))
DECLARE @event table (EvtTime DATETIME, EvtComment VARCHAR(MAX))
INSERT INTO @batch (SampleDate, SampleTime, Recipe) VALUES ('2018-08-09', '11:56:25 
AM', 'Peanut Butter'), ('2018-08-09', '12:11:25 PM', 'Chocolate')
INSERT INTO @event (EvtTime, EvtComment) VALUES ('2018-08-09 11:58:22 AM', 'Turned up 
speed'), ('2018-08-09 11:59:22 AM', 'Turned down temperature')

然后选择并联合交错:

SELECT CONVERT(DATETIME, CAST(SampleDate + ' ' + SampleTime AS datetime)) AS [Date], 
Recipe, NULL as EvtComment FROM @batch
UNION
SELECT EvtTime AS [Date], NULL AS Recipe, EvtComment FROM @event
ORDER BY [Date]

产生:

Date                    Recipe                    EvtComment
----------------------- ------------------------- -------------------------
2018-08-09 11:56:25.000 Peanut Butter             NULL
2018-08-09 11:58:22.000 NULL                      Turned up speed
2018-08-09 11:59:22.000 NULL                      Turned down temperature
2018-08-09 12:11:25.000 Chocolate                 NULL

推荐阅读