我想在日期字段上连接两个表
INNER JOIN ##MetricBase
ON A.MetricID = ##MetricBase.MetricID
AND A.ImportDate = ##MetricBase.ImportDate
如果日期为空,我还希望数据匹配。
有没有比这更清洁的方法
INNER JOIN ##MetricBase
ON A.MetricID = ##MetricBase.MetricID
AND (A.ImportDate = ##MetricBase.ImportDate OR
A.ImportDate IS NULL AND ##MetricBase.ImportDate IS NULL)
补遗
一些评论建议我避免使用无效日期。此查询是分组集的一部分
GROUP BY GROUPING SETS(
(BossID, ID, ImportDate),
(BossID, ImportDate),
(BossID),
(BossID, ID),
(ImportDate),
()
)
空值将成为数据集的一部分
MS Connect 请求支持IS DISTINCT FROM
,这是正确的 ISO 方式。缺乏支持目前是脖子上的痛苦,而你已经这样做的方式实际上在技术上是正确的。
有人确实想出了一个聪明的解决方法,但它并不适用于所有情况。在您的情况下,我相信它会写成:
INNER JOIN ##MetricBase
ON A.MetricID = ##MetricBase.MetricID
AND EXISTS(SELECT A.ImportDate INTERSECT SELECT ##MetricBase.ImportDate)
据说,最新版本的SQL Server非常擅长优化这一点。
从逻辑上讲,你不能进一步减少它,因为由于许多其他原因null
它不等于任何东西,甚至它本身。
它保留在一个谓词中的语法技巧是使用具有"魔术"值的COALESCE
。如果不运行测试,我不知道如果有的话会对性能产生什么影响。我相信您对这两个条件(等于或均为空)的明确陈述更清晰且更易于维护。但为了想法,这里是COALESCE
版本:
DECLARE @nullDate date = '04-02-4242';
...
ON A.MetricID = ##MetricBase.MetricID
AND COALESCE(A.ImportDate , @nullDate) =
COALESCE(##MetricBase.ImportDate, @nullDate)