4

我想在日期字段上加入两个表

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),
()
)

Null 将成为数据集的一部分

4

2 回答 2

2

目前有一个MS Connect Request需要支持IS DISTINCT FROM,这是正确的 ISO 方式。缺乏支持目前是一个令人头疼的问题,而您已经这样做的方式实际上在技术上是正确的。

有人确实想出了一个聪明的解决方法,但它并不适用于所有场景。在你的情况下,我相信它会写成:

INNER JOIN ##MetricBase
ON A.MetricID = ##MetricBase.MetricID
AND EXISTS(SELECT A.ImportDate INTERSECT SELECT ##MetricBase.ImportDate)

据说,最新版本的 SQL Server 非常擅长对此进行优化。

于 2013-10-20T00:47:05.590 回答
1

从逻辑上讲,您不能进一步减少它,因为由于许多其他原因null,它不等于任何东西,甚至它本身。

将其保留在一个谓词中的一种句法技巧是COALESCE与“魔术”值一起使用。如果不运行测试,我不知道这会对性能产生什么影响。我相信您对这两个条件的明确陈述(等于或都为空)更清晰,更易于维护。但是为了想法,这里是COALESCE版本:

DECLARE @nullDate date = '04-02-4242';

...
ON A.MetricID   = ##MetricBase.MetricID
AND COALESCE(A.ImportDate           , @nullDate) = 
    COALESCE(##MetricBase.ImportDate, @nullDate)
于 2013-10-19T23:56:45.263 回答