首页 > 解决方案 > 如何查询表上不存在的行?

问题描述

我有这个下表:

主题 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。另一个注意事项是我无法在表中编辑或添加数据。

您推荐的解决方案是什么?

标签: sqlsql-servertsql

解决方案


您可以在此处使用日历表方法来生成所有周年,然后将其加入当前表:

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'并避免另一个连接。


推荐阅读