6

UPDATE でサブクエリを使用しています。

UPDATE tableA 
SET x,y,z = ( (SELECT x, y, z 
               FROM tableB b
               WHERE tableA.id = b.id
                 AND (tableA.x != b.x
                      OR tableA.y != b.y
                      OR tableA.z != b.z))) );

私の質問は、サブクエリが行を返さない場合はどうなりますか? nullで更新しますか?

第二に、これを書くためのより良い方法はありますか。基本的に、tableB から tableA の 3 つのフィールドを更新していますが、3 つのフィールドのいずれかが異なる場合にのみ更新が行われます。

4

2 に答える 2

6

サブクエリが行を返さない場合はどうなりますか?nullで更新しますか?

はい-次のようにテストできます:

update YourTable
set col1 = (select 1 where 1=0)

これにより、col1がNULLで埋められます。サブクエリが次のように複数の行を返す場合:

update YourTable
set col1 = (select 1 union select 2)

データベースはエラーを生成します。

第二に、これを書くためのより良い方法はありますか?基本的にtableAの3つのフィールドをtableBから更新していますが、更新は3つのフィールドのいずれかが異なる場合にのみ発生するはずです。

直感的にはパフォーマンスは気になりません。本当に更新を避けたい場合は、次のように書くことができます。

UPDATE a
SET x = b.x, y = b.y, z = b.z
FROM tableA a, tableB b 
WHERE a.id = b.id AND (a.x <> b.x OR a.y <> b.y OR a.z <> b.z)

このWHERE句は、NULLでの更新を防ぎます。

于 2009-12-01T23:09:46.423 に答える
0

私が使用したinformixでは、Andomarのソリューションのバリエーション:

UPDATE a
SET x,y,z = ( (SELECT x, y, z 
               FROM tableB b
               WHERE tableA.id = b.id) )
WHERE tableA.id IN (SELECT fromTable.id
                    FROM tableA toTable, tableB fromTable
                    WHERE toTable.id = fromTable.id
                      AND ((toTable.x <> fromTable.x) 
                           OR (toTable.y <> fromTable.y)
                           OR (toTable.z <> fromTable.z))
于 2009-12-02T15:13:57.623 に答える