3

私は2つのテーブルを持っています:

SELECT
    d.id,
    d.permission_lookup_id,
    d.permission_object_id,
    f.id,
    f.permission_lookup_id,
    f.permission_object_id
FROM
    folders f
LEFT JOIN
    documents d
    ON f.id = d.folder_id
WHERE
    d.permission_lookup_id != f.permission_lookup_id OR
    d.permission_object_id != f.permission_object_id

理論的には、すべてが順調であれば何も返さないはずですが、そうではありません。何十万もの結果 (現在は 407,343) を受け取ります。外部キー制約としてに基づいて、と同様に と一致documentsするようにテーブルを更新する必要があります。permission_lookup_idfolderspermission_lookup_idpermission_object_iddocuments.parent_id

次のクエリを試しましたが、ほとんど成功しませんでした。

UPDATE 
    folders f
LEFT JOIN
    documents d
    ON f.id = d.folder_id
SET
    d.permission_lookup_id = f.permission_lookup_id,
    d.permission_object_id = f.permission_object_id
WHERE
    d.permission_lookup_id != f.permission_lookup_id OR
    d.permission_object_id != f.permission_object_id

実行後、70,986 行が影響を受け、407343 行が一致したことがわかりましたが、最初の選択クエリの結果がまだ残っています。

編集: 次のクエリはどちらも 0 行を返します。

SELECT * FROM folders WHERE permission_lookup_id IS NULL OR permission_object_id IS NULL;

SELECT * FROM documents WHERE permission_lookup_id IS NULL OR permission_object_id IS NULL;

空白の値についても同様です。

編集 2: 元の選択/更新クエリでアマチュアの間違いがありました。WHERE 句には、次のものがありました。

WHERE
    d.permission_lookup_id != f.permission_lookup_id OR
    d.permission_object_id != f.permission_lookup_id

私が持っていたはずの場所

WHERE
    d.permission_lookup_id != f.permission_lookup_id OR
    d.permission_object_id != f.permission_object_id

それが原因で誤検知が発生しましたが、必要かどうかに関係なく、更新を実行してすべての列を更新するだけでした。混乱させて申し訳ありません。

4

3 に答える 3

0

permission_lookup_idいずれかのテーブルの値が NULLである可能性はありますか? その場合は、NULL セーフ演算子を使用してみてください。

WHERE
    (NOT d.permission_lookup_id <=> f.permission_lookup_id) OR
    (NOT d.permission_object_id <=> f.permission_lookup_id)

アップデート

次の構文を確認して使用するには、一度に 1 つのフィールドを試してください (実行に時間がかかる場合があります)。

UPDATE folders f
SET f.permission_lookup_id =COALESCE((SELECT d.permission_lookup_id FROM documents d
                                      WHERE f.id = d.folder_id
                                      AND d.permission_lookup_id != f.permission_lookup_id),
                                      f.permission_lookup_id)
于 2012-07-20T15:42:43.337 に答える
0

クエリで左結合の代わりに内部結合を使用してみてください。id フィールドに null 値があるかどうか教えてください。はいの場合、別のアプローチが必要です

于 2012-07-20T15:44:57.023 に答える
0

この代替構文はどうですか:

UPDATE 
    folders f, documents d
SET
    d.permission_lookup_id = f.permission_lookup_id,
    d.permission_object_id = f.permission_object_id
WHERE
    f.id = d.folder_id AND (
    d.permission_lookup_id != f.permission_lookup_id OR
    d.permission_object_id != f.permission_lookup_id)

マニュアルには JOIN 句は問題ないと書かれていますが、違いがあるかどうかを知りたいです。

前の例は、コンマ演算子を使用する内部結合を示していますが、複数テーブルの UPDATE ステートメントでは、LEFT JOIN など、SELECT ステートメントで許可されている任意の種類の結合を使用できます。

于 2012-07-20T15:37:14.870 に答える