4

日付フィールドで 2 つのテーブルを結合したい

INNER JOIN ##MetricBase
ON  A.MetricID = ##MetricBase.MetricID
AND     A.ImportDate = ##MetricBase.ImportDate

また、日付が null の場合にデータを一致させたいと考えています。

よりクリーンな方法はありますか

 INNER JOIN ##MetricBase
 ON    A.MetricID = ##MetricBase.MetricID
 AND   (A.ImportDate = ##MetricBase.ImportDate OR
        A.ImportDate IS NULL AND  ##MetricBase.ImportDate IS NULL)

補遺

いくつかのコメントは、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、それ自体でさえ、何にも等しくないため、論理的にはそれ以上減らすことはできません。

1 つの述語でそれを維持するための構文上のトリックはCOALESCE、'magic' 値を使用することです。テストを実行しないと、パフォーマンスにどのような影響があるかわかりません。両方の条件 (equal OR both null) の明示的なステートメントは、より明確で保守しやすいと思います。しかし、アイデアのために、ここに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 に答える