0

我有两个名为TableAand的表TableB。两者TableATableB都包含以下列:name, member_id. TableB当前包含 的“正确”值member_id,而TableA没有。

我想做的是将列中的所有值迁移member_idTableB相应列中TableA(与列中的值匹配name)。但是,有时两个表之间的名称键入略有不同。

我编写了以下 SQL 查询,尽管下面的子查询WHEN EXISTS不正确。有人可以帮助我吗?谢谢。

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=类似于TableB.member_id . 0 和 1 用于调试,而不是最终目标。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的一种方法。这种方法取最大值。通过使用聚合函数,查询可以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 回答