sql >> データベース >  >> RDS >> Mysql

MYSQL結合更新の内部ステップ

    「クエリが行を正しく更新しない」の場合:

    bを更新します 最小まで bの 同じaを持つすべての行

    次のJOINを使用することを提案しました それを行うには:

    UPDATE test.tem t1
      JOIN test.tem t2
        ON t1.a = t2.a
    SET t1.b = t2.b
    WHERE t1.b > t2.b
         OR t1.b IS NULL;
    

    あなたが思うかもしれないことに反して、その JOIN 1-1 JOINは実行されません 。実際には、多対多の JOIN 昨日言ったように 結合句で主キー(またはnull以外の一意キー)を使用しないでください。

    実際、そのクエリを SELECTとして書き直します おそらく問題を理解するのに役立ちます:

    SELECT t1.a as t1a, t1.b as t1b, t2.a as t2a,t2.b as t2b FROM tem t1 JOIN tem t2
        ON t1.a = t2.a
    WHERE t1.b > t2.b
         OR t1.b IS NULL;
    
    +------+---------+------+--------+
    | T1A  |  T1B    | T2A  |  T2B   |
    +------+---------+------+--------+
    |   1  | (null)  |   1  | 2      |
    |   1  | 2       |   1  | 1      |
    |   1  | (null)  |   1  | 1      |
    |   1  | (null)  |   1  | (null) |
    +------+---------+------+--------+
    

    http://sqlfiddle.com/#!2/856a7/8

    ご覧のとおり、行(1、null) (1、1)に一致 、(1、2) および(1、null) 。クエリの(非決定論的な)実行順序に応じて、これにより、 bに可能な3つの値のいずれかが割り当てられる可能性があります。 (それについてはよくわかりませんが、多分 それを更新することさえいくつか 時間)。ある程度まで、テスト中に「間違った」結果を見つけたのは幸運でした!

    これで、クエリで期待どおりの結果が得られない理由がもう少し説明されることを願っています。マルチテーブル以降 UPDATE ステートメントではORDERBYは許可されていません GROUP BYでもありません 私の場合、「良い」結果を見つけるための条項は、最小の最初のを見つける以外に多くのオプションはありません。 サブクエリを介して...



    1. 許容最大値8060を超えるサイズ8937の行を作成できません

    2. MySQLdbモジュールはプリペアドステートメントをサポートしていますか?

    3. 主キーのない重複したmysql行を削除します

    4. MySQLデータベースへの単純なメタデータの添付