小编典典

查询以显示表格中遗漏的日期

sql

这是使用 SQL Server 2019

很难解释; 我有两张表:

日期:

日期
2022 年 1 月 1 日
2022 年 2 月 1 日

保险:

INSURANCE_COVER_ID INSURANCE_DATE
1 2022 年 2 月 1 日
1 2022 年 3 月 1 日
2 2021 年 12 月 31 日
2 2022 年 1 月 1 日

我需要从没有in的INSURANCE_COVER地方获取所有行,并且我需要显示缺失的行。INSURANCE_COVER_ID``INSURANCE_DATE``DATES``DATE

我需要返回的结果如下所示:

日期 INSURANCE_ID
2022 年 1 月 1 日 1
2022 年 2 月 1 日 2

我只能用一个while循环来做到这一点,但性能很糟糕。


阅读 226

收藏
2022-07-21

共1个答案

小编典典

我们可以使用交叉连接构建所需值的列表,然后使用排除连接来查找该集合中缺少的内容:

SELECT d.[Date], IDs.INSURANCE_COVER_ID
FROM [dates] d
CROSS JOIN (SELECT DISTINCT INSURANCE_COVER_ID FROM INSURANCE_COVER) IDs
LEFT JOIN INSURANCE_COVER C ON C.INSURANCE_COVER_ID = IDs.INSURANCE_COVER_ID
    AND C.Insurance_Date = d.[Date]
WHERE C.INSURANCE_COVER_ID IS NULL

在这里看到它:

https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=d26d09494a0d6b06623a35610170c8eb

我们可能会使用 aNOT EXISTS()而不是排除连接来更快地完成此操作,但我个人的经历是,我发现编写排除连接更容易和更快,并且性能差异并不总是证明额外的初始时间投资是合理的。


作为旁注,该数据中的日期格式是错误的。不同的语言和文化期望日期以不同的方式格式化。有些喜欢 MM/dd/yyyy。有些人喜欢 dd-MM-yyyy。其他人可能更喜欢 yyyy-MM-dd。

SQL 语言也不例外:它对日期的外观有自己的期望,并且在编写 SQL时应该使用这种格式。当写一个没有时间的日期值时,它看起来像这样:(yyyyMMdd注意除了排序之外完全没有分隔符)。包含时间值时,它看起来像这样yyyy-MM-ddTHH:mm:ss[.fff]

2022-07-21