0

aTable1、aTable2という名前の2つのテーブルがあると仮定します

aTable1のuserIDはidentityに設定されており、次のデータが含まれています。

userID  email          FirstName    LastName
1       NULL               C            CC
2       NULL               D            DD
3       a@yahoo.com        A            AA
4       b@yahoo.com        B            BB
5       e@yahoo.com        E            EE
6       f@yahoo.com        NULL         NULL
7       g@yahoo.com        NULL         NULL

aTable2には、次のデータが含まれています。

userID  email          FirstName    LastName    Title
3       a@yahoo.com      A            AA       student
4       b@yahoo.com      B            BB       student
5       e@yahoo.com      E            EE       student
NULL    NULL             C            CC       dean
NULL    NULL             D            DD       advisor
NULL    f@yahoo.com NULL    NULL               student2
NULL    g@yahoo.com NULL    NULL               student3

aTable1に基づいてaTable2.userIDを更新したいのですが、2つのテーブルにnull値が含まれていることがわかっているので、次のようにします。

set ANSI_NULLS off
update aTable2
set aTable2.userID = a.userID
from aTable a, aTable2 b 
where a.FirstName = b.FirstName and a.LastName = b.LastName and a.email = b.email

ただし、この更新によってすべてのuserIDが更新されるわけではなく、実際には、電子メールがnullに等しくないユーザーIDのみが更新されますが、ANSI_NULLSはすでにオフに設定されています。私は何を間違えましたか?

4

2 に答える 2

5

それが機能しないことが文書化されています:

SET ANSI_NULLS ONNULL比較のオペランドの1つが変数またはリテラルのいずれかである場合にのみ、比較に影響しますNULL。比較の両側が列または複合式である場合、設定は比較に影響しません。

于 2013-02-13T01:22:54.193 に答える
2

更新クエリを機能させるには、次のような方法を試すことができます。

UPDATE a2
SET
   userId = a.UserId
FROM
    aTable2 a2
    JOIN aTable1 a ON 
        ISNULL(a.Email,'NULL') = ISNULL(a2.Email,'NULL') AND 
        ISNULL(a.FirstName,'NULL') = ISNULL(a2.FirstName,'NULL') AND
        ISNULL(a.LastName,'NULL') = ISNULL(a2.LastName,'NULL')

値がNULLの場合、値を任意に「NULL」に設定しました。データに表示されない個別の値を使用して、誤検知を受け取らないようにします。

また、JOINでOR基準を使用し、両方の値のNULLをチェックする他のソリューションも確認しました。

((a.Email = a2.Email) OR (a.Email IS NULL AND a2.Email IS NULL)) ...

幸運を。

于 2013-02-13T01:27:16.360 に答える