update只将第一行值追加到另一个表中,为什么?

svdrlsy4  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(294)

我有一个超过1米的目标表。每次我都会得到5万行,其中可能包含多个重复的条目。因此,我决定将csv数据存储到一个临时表中,然后通过比较两个表之间的行从临时表到目标表。。。
如果发现重复条目,请将临时表中的数据追加到目标表中,否则插入表中。。。我在这里使用分区,所以重复密钥更新在这里不起作用。。在临时表中,我没有使用任何键
我有两张table,看起来像下面

temp_table

Name |  Type
John |  Civil
John |  Mech

target_table

Name | Type
John | Civil

当我在查询下面运行时,我得到的是一行的输出

UPDATE target_table JOIN temp_table
 ON  temp_table.Name = target_table.Name
 SET target_table.Type = IF((LOCATE(temp_table.Type, target_table.Type) > 0) 
 target_table.Type,CONCAT(target_table.Type,',',temp_table.Type))

target_table

Name | Type
John | Civil

我期望输出如下

target_table

Name | Type
John | Civil, Mech

我能知道哪里出了问题吗?

6mw9ycah

6mw9ycah1#

您应该在join中使用groupconcat和子查询

UPDATE target_table 
 JOIN (
    select name, group_concat(Type) grouped
    from temp_table 
    group by name
 ) t ON t.Name = target_table.Name
 SET target_table.Type = t.grouped
bsxbgnwa

bsxbgnwa2#

我怀疑(但不确定),希望知道的人会跳进来纠正我,updatejoin不会像select那样创建笛卡尔积。作为试图证明

truncate table temp_table;
insert into temp_table values
( 'John' , 'mech' ),
( 'John' , 'abc'  );
truncate table target_table;
insert into target_table values
('john', 'civil', 9 );

UPDATE target_table JOIN temp_table
ON  temp_table.Name = target_table.Name
set target_table.type = (concat(target_table.Type,',',temp_table.Type));

select * from target_table;

+------+------------+------+
| Name | Type       | LOC  |
+------+------------+------+
| john | civil,mech |    9 |
+------+------------+------+
1 row in set (0.00 sec)

请注意,临时表中的被忽略,而mech完全是偶然选择的。
如果我们改变临时表的顺序

truncate table temp_table;
insert into temp_table values
( 'John' , 'abc' ),
( 'John' , 'mech'  );
truncate table target_table;
insert into target_table values
('john', 'civil', 9 );

UPDATE target_table JOIN temp_table
ON  temp_table.Name = target_table.Name
set target_table.type = (concat(target_table.Type,',',temp_table.Type));

select * from target_table;

我们得到

+------+-----------+------+
| Name | Type      | LOC  |
+------+-----------+------+
| john | civil,abc |    9 |
+------+-----------+------+
1 row in set (0.02 sec)

在这里,完全是偶然选择的。
在我看来,最安全的方法是一行一行的(光标)。

相关问题