我的表有一个包含id列表的列: 1234,2345,3456
这些ID中的每一个都是同一个表中其中一行的主键。
每一行都有一个名称字段。如何将ID列表更改为名称列表?
ID, NAME, IDLIST
----------------------
1234, name1, (null)
2345, name2, 1234,2345
3456, name3, 1234,3456
为每列使用上面的idList将创建一个新列表:
nameList for 2345 = name1,name2
nameList for 3456 = name1,name3
SQL的特定方言并不重要,我只是试图找出是否可以在单个更新中完成。
答案 0 :(得分:1)
尝试此解决方案(MySQL,for Oracle将GROUP_CONCAT更改为WMSYS.WM_CONCAT)
的制备:将
create table tmp_table(
id int,
name varchar(5),
idslist varchar(20)
);
insert into tmp_table(id, name, idslist) values(
1234,
'name1',
null
);
insert into tmp_table(id, name, idslist) values(
2345,
'name2',
'1234,2345'
);
insert into tmp_table(id, name, idslist) values(
3456,
'name3',
'1234,3456'
);
查询:
select
t1.id, t1.name, t1.idslist, GROUP_CONCAT(distinct t2.name)
from
tmp_table t1
LEFT JOIN tmp_table t2 ON t1.idslist like CONCAT('%', t2.id, '%')
GROUP BY t1.id, t1.name, t1.idslist
;
结果:
1234 name1
2345 name2 1234,2345 name1,name2
3456 name3 1234,3456 name3,name1
它有效,但如果你有id,比如12和1234,可能会引起麻烦。
我建议您使用多对多关系表。如果您需要订单,可以添加订单字段,它将类似于
+----------+---------------------+
| child_id | parent_id | position|
+----------+---------------------+
| 2345 | 1234 | 1 |
| 2345 | 2345 | 2 |
+----------+---------------------+