sql - 更改 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 缺少一个值),则将该条目的缺失值显示为零/空。
谢谢。
解决方案
我想你只需要一个 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
推荐阅读
- sql - Postgres,如果表中不存在id,则返回默认行
- podman - podman pod 更改端口映射
- php - 你能用一个 HTML 文件制作一个表单吗?
- java - DB 列上的 Spring JPA 错误返回与列名相关的错误
- javascript - 在加载 DOM 之前运行的脚本标签
- python - 将文本从 tkinter 文本框保存到 .doc 文件时,如何保持格式?
- excel - 为什么我的 SSRS 生成的大型 excel (XLSX) 文件无法打开?
- c# - 有没有办法将“Globals.ThisAddIn”的引用从 MS Word 加载项传递到同一解决方案中的 WinForms 项目?
- reactjs - 使用 GitHub Actions 和 Firebase 时,Jest 在测试运行完成后一秒没有退出
- java - 在 Spring Boot 应用程序中登录后维护用户的会话(HttpSession)