1

私はこのコードを持っていますが、それがどのように機能するかわかりません:

UPDATE Data
    SET Processed = 1
FROM Data
JOIN Meters
    ON Meters.ServiceAccount = serv_acct
where COALESCE(Processed, 0) = 0

私の質問は最後の行についてです!この場合、その行は真になりますか? Processed を 1 に設定しているので、どのように機能します where COALESCE(Processed, 0) = 0か?

この方法で Coalesce を使用するロジックを説明できる人はいますか?

このコードは私が書いたものではありません。ありがとうございました

4

2 に答える 2

2

クエリは次のとおりです。

UPDATE Data
    SET Processed = 1
    FROM Data JOIN
         Meters
         ON Meters.ServiceAccount = serv_acct
    where COALESCE(Processed, 0) = 0;

クエリは、変更が行われる前に、操作対象の行のupdate母集団を決定します。したがって、最終行はが またはのいずれかである行を取得しています。は、それらの行に対して に設定されます。つまり、句は、変更する行に対するフィルターとして機能しています。特定のステートメントは、 の値がまたはである行を保持することです。ProcessedNULL0updateProcessed1whereProcessedNULL0

于 2013-08-05T18:26:43.093 に答える
0

The COALESCE function is described here: http://technet.microsoft.com/en-us/library/ms190349.aspx

I think the reason behind using this predicate where COALESCE(Processed, 0) = 0 was to filter all rows which have column Processed IS NULL or equal to 0.

Instead, I would use use predicates:

UPDATE Data
SET Processed = 1
FROM Data JOIN
    Meters 
    ON Meters.ServiceAccount = serv_acct
where Processed IS NULL OR Processed = 0;

because they are SARGable. This means Index Seek.

Applying an expression on Processed column will force SQL Server to choose an [Clustered] Index Scan.

于 2013-08-05T19:03:03.013 に答える