sql - 如何查询表上不存在的行?
问题描述
我有这个下表:
主题 | YYYYWW | 地位 | 分数 |
---|---|---|---|
历史 | 2020W01 | 经过 | 80 |
数学 | 2020W01 | 经过 | 85 |
历史 | 2020W02 | 经过 | 92 |
数学 | 2020W02 | 经过 | 89 |
历史 | 2020W03 | 失败的 | 50 |
历史 | 2020W04 | 经过 | 81 |
数学 | 2020W04 | 经过 | 95 |
所以我的目标是查询数学主题,它显示所有每周标记,如下表所示:
主题 | YYYYWW | 地位 | 分数 |
---|---|---|---|
数学 | 2020W01 | 经过 | 85 |
数学 | 2020W02 | 经过 | 89 |
数学 | 2020W03 | 无效的 | 无效的 |
数学 | 2020W04 | 经过 | 95 |
我正在使用的当前查询是:
SELECT Subject, YYYYWW, Status, Marks FROM dbo.Test WHERE Subject = 'Math' AND Status = 'PASS' ORDER BY YYYYWW
我得到这张桌子:
主题 | YYYYWW | 地位 | 分数 |
---|---|---|---|
数学 | 2020W01 | 经过 | 85 |
数学 | 2020W02 | 经过 | 89 |
数学 | 2020W04 | 经过 | 95 |
我正在使用 SQL Server Management Studio 18。另一个注意事项是我无法在表中编辑或添加数据。
您推荐的解决方案是什么?
解决方案
您可以在此处使用日历表方法来生成所有周年,然后将其加入当前表:
SELECT
'Math' AS Subject,
t1.YYYYWW,
t2.Status,
t2.Marks
FROM (SELECT DISTINCT YYYYWW FROM dbo.Test) t1
LEFT JOIN dbo.Test t2
ON t2.YYYYWW = t1.YYYYWW AND
t2.Subject = 'Math';
演示
请注意,此问题的更通用解决方案将涉及所有主题的第二个日历表:
(SELECT DISTINCT Subject FROM dbo.Test)
然后,我们将把它与所有周年的第一个日历表交叉加入,以获得所有主题和周年的网格。但是,在这种特殊情况下,您只关心一个主题,所以我选择只选择'Math'
并避免另一个连接。
推荐阅读
- java - 如何处理 java.lang.IllegalStateException 的异常,当服务器抛出 http-listener max-parameters 的异常时限制在 wildfly 上的交叉
- machine-learning - 将 google colab 与 google drive 一起使用时出现输入/输出错误
- assembly - Clion 中的嵌入式汇编程序块
- github - 无法构建 Git Bash Jekyll 站点
- java - 如何在点击时生成新活动
- list - 没有显式递归的两个列表的并集和交集
- c# - 拒绝管理员用户访问
- python - 使用 Python 创建 HUD
- node.js - MongoDB 查找嵌套查询以填充对象
- php - Symfony 4 | 多对多关系 - 无法确定属性的访问类型