19

値が別のテーブルのフィールドと一致しない場合に、あるテーブルのフィールドを更新する更新クエリがあります。

UPDATE  table1
SET     a.field1 = b.field3
FROM    table1 a ,
        table2 b
WHERE   a.field2 = b.field2
        AND a.field1 <> b.field3

私が抱えている問題は、a.field1 が null で b.field3 が値である場合、または a.field1 が値で b.field3 が null である場合に検出されないことです。

以下を追加することでこれを回避しました...

UPDATE  table1
SET     a.field1 = b.field3
FROM    table1 a ,
        table2 b
WHERE   a.field2 = b.field2
        AND ( a.field1 <> b.field3
              OR (a.field1 IS NOT NULL
              AND b.field3 IS NULL)
              OR (a.field1 IS NULL
              AND b.field3 IS NOT NULL)
            )

私の質問は、なぜこれが起こっているのか、そしてこれを防ぐためにクエリをどのように構成するのが最も良いのかということに集中していますか?

4

8 に答える 8

0

クエリを記述するとき、a.field1 = b.field3実際には 2 つの仮定を行います。テーブル a の field1 には値が含まれている必要があり、b テーブルの field3 にも値が含まれている必要があります。「欠落情報および適用外情報」を値と比較することはできません。この比較の結果は不明です。詳細については、Wikipediaを参照してください。

于 2013-04-10T15:04:20.367 に答える
0

別の方法は、CHECKSUM関数を使用することです

create table #temp
  (
    val1 varchar(255),
    val2 varchar(255)
  )

  insert into #temp values(NULL, NULL) 
  insert into #temp values(NULL, 'B') 
  insert into #temp values('A', NULL) 
  insert into #temp values('A', 'B') 
  insert into #temp values('A', 'A') 

  select *, 
  'Are Not Equal' = case 
   when val1 <> val2 or checksum(val1) <> checksum(val2) then 'true' 
   else 'false' end 
  from #temp
于 2016-03-17T18:56:23.857 に答える