0

と という名前の 2 つのテーブルがTableAありTableBます。と の両方TableATableB次の列が含まれます: namemember_idTableB現在、 には の「正しい」値が含まれていますが、含まれてmember_idTableAません。

私がしたいのは、列member_idのすべての値をTableBそれぞれの列に移行することですTableA(列列の値と一致しnameます)。ただし、2 つのテーブル間で名前の入力がわずかに異なる場合があります。

WHEN EXISTSサブクエリは正しくありませんが、次のSQLクエリを書きました。誰かがこれを手伝ってくれますか? ありがとう。

UPDATE TableA
SET member_id = 
CASE
    WHEN EXISTS
    (SELECT member_id
    FROM TableB
    WHERE TableB.name ILIKE '%' || 'TableA.name' || '%'
    LIMIT 1)

    THEN member_id

    ELSE '1'
END
WHERE 
TableA.member_id = '0'

また、member_idが不明な場合は 0 に設定するように設定しました。列ELSE '1'の 0 を 1 に更新してmember_id、クエリが実行され、その行が既に変更されていることがわかるようにします。

明確化: に 似ている=TableA.member_idを設定したい。0 と 1 はデバッグ用であり、最終目標ではありません。TableB.member_id TableA.name TableB.name

4

2 に答える 2

1

あなたはTABLEA.NAME引用符を持っています。それらを削除します。

UPDATE TableA
    SET member_id = (CASE WHEN EXISTS (SELECT member_id
                                       FROM TableB
                                       WHERE TableB.name ILIKE '%' || TableA.name || '%'
                                      )

                          THEN member_id
                          ELSE '1'
                     END)
    WHERE TableA.member_id = '0'

また、LIMIT 1存在を確認しているため、 は必要ありません。

whereそして、条件を句に移動して、ロジックを明確にすることができます(私の意見では):

UPDATE TableA
    SET member_id = '1'
    WHERE TableA.member_id = '0' and
          exists (SELECT member_id
                  FROM TableB
                  WHERE TableB.name ILIKE '%' || TableA.name || '%'
                 )

編集(コメントに応じて)

メンバー ID を取得する 1 つの方法を次に示します。このアプローチは最大値をとっています。集計関数を使用することにより、クエリはcoalesce()集計で使用して不明な値を提供できます。

UPDATE TableA
    SET member_id = (SELECT coalesce(max(member_id), 'Unknown')
                     FROM TableB
                     WHERE TableB.name ILIKE '%' || TableA.name || '%'
                    )
    WHERE TableA.member_id = '0';

join最後に、構文を使用してこれを記述できます。

UPDATE TableA
    SET TableA.member_id = TableB.member_id
    FROM TableB
    WHERE TableB.name ILIKE '%' || TableA.name || '%' and
          TableA.member_id = '0'

複数の一致がある場合、クエリは任意の一致を選択します。

于 2013-06-19T14:30:45.080 に答える
0

を必要としない代替シナリオlike:

UPDATE TableA dst
SET member_id =  COALESCE ( src.member_id, -1 )
FROM (
        SELECT a.name , b.member_id
        FROM TableA a
        LEFT JOIN TableB b ON POSITION (b.name IN a.name) > 0
        ) src
WHERE  dst.name = src.name
AND dst.member_id < 10
        ;

注: member_id を文字から数値に変更しました。これは、より理にかなっています。

テストデータ:

CREATE TABLE TableA ( member_id INTEGER , name varchar);
CREATE TABLE TableB ( member_id INTEGER , name varchar);

INSERT INTO TableA(member_id,name) VALUES
(0, 'Jack' ), ( 1, 'Jill'), (2 , 'Bob'), ( 3, 'Alice' );
INSERT INTO TableB(member_id,name) VALUES
(11, 'ack' ), ( 12, 'ill'), (13 , 'Do'), ( 14, 'lic' );

結果:

 member_id | name  
-----------+-------
        11 | Jack
        12 | Jill
        -1 | Bob
        14 | Alice
于 2013-06-19T15:12:30.560 に答える