我有两个名为TableA
和TableB
的表。 TableA
和TableB
都包含以下列:name
,member_id
。 TableB
目前包含member_id
的“正确”值,而TableA
则不包含。{/ 1}
我想要做的是将member_id
的{{1}}列中的所有值迁移到TableB
中的相应列(与列{{1}中的值匹配) }专栏)。但是,有时两个表之间的名称输入略有不同。
我在SQL查询后写了这个,尽管TableA
下的子查询不正确。有人可以帮助我吗?感谢。
name
另外,我将其设置为当WHEN EXISTS
未知时,将其设置为0. 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'
cluase是将member_id
列中的0更新为1,以便我知道该查询已经运行并修改了该行。
澄清:我希望设置 ELSE '1'
= member_id
TableA.member_id
类似于 TableB.member_id
。 0和1用于调试,而不是最终目标。
答案 0 :(得分: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'
如果有多个匹配项,则查询将选择任意一个。
答案 1 :(得分: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