4

t1t2という 2 つのテーブルがあるとします。t1には 2 つのフィールドがあり、1 つはaと呼ばれる一意の値を含み、もう 1 つはvalueと呼ばれるフィールドです。テーブルt2には、bと呼ばれる一意の値を含まないフィールドと、同じくvalueと呼ばれるフィールドがあります。ここで、次の更新クエリを使用すると (これは MS Access を使用しています):

UPDATE t1
INNER JOIN t2 ON t1.a=t2.b
SET t1.value=t2.value

次のデータがある場合

     t1                  t2
 a  | value          b  | value
------------        ------------
'm' |  0.0           'm'|  1.1
                     'm'|  0.2

クエリを実行して、t1.value で最終的にどのような値になりますか? いくつかのテストを実行しましたが、一貫した動作を見つけることができなかったので、未定義である可能性があると推測しています. それとも、この種の更新クエリは実行すべきではないものですか? なぜ私がこのようにしなければならなかったのかについては、長い退屈な話がありますが、それは私の調査の技術的な性質とは関係ありません。

4

2 に答える 2

3

これは非決定論的クエリとして知られています。これは、クエリや基になるデータを変更せずにクエリを複数回実行して、異なる結果を得ることができることを正確に意味します。

実際には、発生した最後のレコードで値が更新されるため、この場合は2回更新されますが、最初の更新は最後に上書きされます。まったく制御できないのは、SQL エンジンがレコードにアクセスする順序です。適切と思われる順序でレコードにアクセスします。これは、最初から単にクラスター化されたインデックス スキャンである場合もあれば、他のインデックスを使用してレコードにアクセスする場合もあります。別の順序でクラスター化されたインデックス。あなたはこれを知る方法がありません。更新を複数回実行しても同じ結果になる可能性が非常に高くなります。これは、データに変更がなければ、SQL オプティマイザーが同じクエリ プランを使用するためです。ただし、ここでも保証はありません。そのため、決定論的な結果を得るために、非決定論的なクエリに頼るべきではありません。


編集

T1 の値を T2 の対応する最大値に更新するには、次を使用できますDMax

UPDATE  T1
SET     Value = DMax("Value", "T2", "b=" & T1.a);
于 2013-08-15T09:18:08.880 に答える
1

指示どおりにクエリを実行すると、行「m」の「t1」になる「値」は、「t2」に ID 値の行が複数あるため、事実上ランダムになります。 「私」。

ID 'm' を持つ行のコレクションの最大 (max 関数)、最小 (min 関数)、またはその他の集計が必要であることを具体的に指定しない限り、データベースは定義された選択を行うことができず、何でも返します。最初に出くわす値であるため、一貫性のない動作になります。

お役に立てれば。

于 2013-08-15T09:14:36.540 に答える