0

一部のデータを古いデータベースからスキーマがわずかに異なる新しいデータベースに移行しようとしていますが、私の SQL はそれほど強力ではありません。

古いスキーマ: 3 つのフラグの順列のセットを持つことができるフィールドを持つ "Person" と呼ばれるテーブルがあります。Person テーブルには、"Flags" と呼ぶ別のテーブルへの外部キーがあります。They Flags テーブルには、文字列内のこれらのフラグの組み合わせごとに行があります。

1 - Yes No No
2 - Yes Yes No
3 - Yes No Yes
4 - Yes Yes Yes
5 - No Yes No
6 - No Yes Yes
7 - No No Yes

新しいスキーマはこのテーブルを必要としません (ありがたいことに)。これらのフラグは、「Person」テーブルの単なるフィールドであり、BIT フィールドになりました。

私がやりたいことは次のようなものです:

UPDATE database2.Person SET (flag1, flag2, flag3) VALUES (true, false false) WHERE database1.Person.flag_id = 1;

次に、ID と値を適宜変更して、7 つの異なるクエリを実行できます。もちろん、問題は上記が正しい SQL ではないことです。ある種のJOINが必要だと思います...またはwhere句のサブセレクトか何か?

前進する最善の道に行き詰まった。ここでの私の別れの考えは、これは単一のクエリに圧縮する必要はなく、特にエレガントである必要もないということです。このクエリを 1 回実行すれば、それで完了すると思います。

4

2 に答える 2

2

次のようなものを試すことができます:

update database2.Person p2 join database1.Person p1 on p1.PersonId = p2.PersonId
set    flag1 = case when p1.Flag_id in (1,2,3,4) then true else false end case,
       flag2 = case when p1.Flag_id in (2,4,5,6) then true else false end case,
       flag3 = case when p1.Flag_id in (3,4,6,7) then true else false end case

(mySQl 構文用に編集)

于 2013-05-29T15:15:19.650 に答える
0

私があなたの質問を理解していれば、これはうまくいくはずです。Person_Id各テーブルに一致があることを前提としています。

UPDATE db2.Person p
    JOIN db1.Person p2 ON p.Person_Id = p2.Person_Id
SET p.Flag1 = 1, 
    p.Flag2 = 0, 
    p.Flag3 = 0
WHERE p2.Flag_Id = 1;

Flags テーブルのフラグ値が列の場合、単一のクエリを簡単に実行できますが、私が理解しているように、それは単なる文字列フィールドです。これは例です:

UPDATE db2.Person p
    JOIN db1.Person p2 ON p.Person_Id = p2.Person_Id
    JOIN db1.Flags f ON p2.Flag_Id = f.Flag_Id
SET p.Flag1 = CASE WHEN f.Flag1 = 'Yes' THEN 1 ELSE 0 END,
    p.Flag2 = CASE WHEN f.Flag2 = 'Yes' THEN 1 ELSE 0 END,
    p.Flag3 = CASE WHEN f.Flag3 = 'Yes' THEN 1 ELSE 0 END
于 2013-05-29T15:16:01.630 に答える