这是使用 SQL Server 2019
很难解释; 我有两张表:
日期:
保险:
我需要从没有in的INSURANCE_COVER地方获取所有行,并且我需要显示缺失的行。INSURANCE_COVER_ID``INSURANCE_DATE``DATES``DATE
INSURANCE_COVER
INSURANCE_COVER_ID``INSURANCE_DATE``DATES``DATE
我需要返回的结果如下所示:
我只能用一个while循环来做到这一点,但性能很糟糕。
我们可以使用交叉连接构建所需值的列表,然后使用排除连接来查找该集合中缺少的内容:
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()而不是排除连接来更快地完成此操作,但我个人的经历是,我发现编写排除连接更容易和更快,并且性能差异并不总是证明额外的初始时间投资是合理的。
NOT EXISTS()
作为旁注,该数据中的日期格式是错误的。不同的语言和文化期望日期以不同的方式格式化。有些喜欢 MM/dd/yyyy。有些人喜欢 dd-MM-yyyy。其他人可能更喜欢 yyyy-MM-dd。
SQL 语言也不例外:它对日期的外观有自己的期望,并且在编写 SQL时应该使用这种格式。当写一个没有时间的日期值时,它看起来像这样:(yyyyMMdd注意除了排序之外完全没有分隔符)。包含时间值时,它看起来像这样yyyy-MM-ddTHH:mm:ss[.fff]:
yyyyMMdd
yyyy-MM-ddTHH:mm:ss[.fff]