首页 > 解决方案 > 更改 2 选择连接查询以填充零/空,而不是在一个查询中不存在数据时过滤掉

问题描述

我有下面的代码,它查询同一个表以获取 2 个不同标签的值,并在它们的时间戳匹配时并排显示它们(2 列)。这一直工作正常。但是,在极少数情况下,标签 1 的值可能不会记录在数据库中,从而使两个 SELECT 结果的长度不同,此时我的 WHERE 子句最后会过滤掉其中一行(确实表 B) 上没有匹配项。

如果数据库上存在该条目,它们将始终具有相同的时间戳,因此可以比较它们。但有时一个不存在,因为我的存档程序仅在该值与上次报告时发生变化时才写入数据库,如果它没有变化或巧合它与以前相同,它不会写入 SQL,因此新 ts 的值将不存在。

SELECT A.[TIME_STAMP], A.[Value1], B.[Value2]
FROM (SELECT TIME_STAMP
      ,TAG
      ,CAST(DESCRIPTION1 AS float) AS 'Value1'
    FROM [dbo].[MAINLOG]
    WHERE TAG LIKE '%01%Day%') A
cross JOIN (SELECT TIME_STAMP
      ,TAG
      ,CAST(DESCRIPTION1 AS float) AS 'Value2'
    FROM [dbo].[MAINLOG]
    WHERE TAG LIKE '%02%Day%') B
WHERE A.TIME_STAMP = B.TIME_STAMP
ORDER BY A.TIME_STAMP

结果如下所示:

TIME_STAMP                 Value1  Value2
2019-10-19 08:19:05.000    0       0
2019-10-19 08:50:40.153    1.5     1
2019-10-19 09:03:39.107    2       2
2019-10-19 09:04:15.113    3.5     2.5

有没有人建议将查询修改为:

1) 按时间戳匹配 2 个查询的结果,并将它们并排显示在 2 列中;和

2) 如果 SELECT 查询 A 和 B 产生不同长度的表(例如结果 B 缺少一个值),则将该条目的缺失值显示为零/空。

谢谢。

标签: sql

解决方案


我想你只需要一个 LEFT 加入 -

SELECT A.TIME_STAMP, A.Value1, B.Value2
FROM (SELECT TIME_STAMP
      ,TAG
      ,CAST(DESCRIPTION1 AS float) AS 'Value1'
    FROM [dbo].[MAINLOG]
    WHERE TAG LIKE '%01%Day%') A
LEFT JOIN (SELECT TIME_STAMP
      ,TAG
      ,CAST(DESCRIPTION1 AS float) AS 'Value2'
    FROM [dbo].[MAINLOG]
    WHERE TAG LIKE '%02%Day%') B
WHERE A.TIME_STAMP = B.TIME_STAMP
ORDER BY A.TIME_STAMP

推荐阅读