[英]MySQL Update joining information from another table
我在MySQL上真的很新,所以希望我能帮到您,因为我在任何地方都找不到与我的问题有关的任何答案。 我试图用另一个表中的信息更新MySQL表中的字段,到目前为止,我有这样的事情:
UPDATE item i
SET i.brandId = (SELECT t.taxonomyId
FROM taxonomy t
WHERE t.taxonomyName = (SELECT b.brandName
FROM brand b
WHERE b.brandId = i.brandId
AND b.companyId = 9)
AND t.taxonomyType = 'brand'
AND t.companyId = 9)
WHERE i.companyId = 9
基本上,我有一个名为brand
的旧表,并将其所有信息复制到一个称为taxonomy
的新表中,两个表之间的唯一区别是ID(其他所有内容保持不变),因此我需要更新表item
中的所有brandId
字段从brand
到taxonomy
所以我可以保留用于更新ID的名称。
我的查询的问题是我收到一条错误消息:子查询返回的行数超过1
谢谢!
编辑:
表结构为:
brand
brandId - brandName - companyId
item
itemId - itemName - brandId - companyId
taxonomy
taxonomyId - taxonomyName - companyId
我认为您可能需要此查询:
update item i
set i.brandid =
(select t.taxonomyid
from taxonomy t
join brand b
on t.taxonomyname = b.brandname
and t.companyid = b.companyid
where b.brandid = i.brandid)
要在进行更新之前进行测试,请尝试运行以下命令,以说明将要更改的内容:
select t.taxonomyid as new_id_to_be_given,
b.brandid as old_id_going_away,
t.taxonomyname,
t.companyid
from taxonomy t
join brand b
on t.taxonomyname = b.brandname
and t.companyid = b.companyid
order by 1
这将用与两个表之间相同的(分类名称和品牌名称)和(companyid和companyid)值关联的分类标准值替换项目表上的商标。
如果此查询仍返回2+行,则表示TAXONOMY或BRAND表具有多于一行的分类名称和公司ID的唯一组合。
要诊断可能在哪里发生,可以运行以下命令(然后在解决问题后运行上面的命令):
select 'taxonomy' as table_with_issue,
taxonomyname,
companyid,
group_concat(taxonomyid separator ', ') as multiple_ids
from taxonomy
group by taxonomyname, companyid
having count(*) > 1
union all
select 'brand', brandname, brandid, group_concat(brandid separator ', ')
from brand
group by brandname, brandid
having count(*) > 1
子查询返回的行多于1条表示任一Select语句返回的行多于一条。
您不能将i.brandId设置为多个值。 您可以尝试的一件事是增加限制1:
UPDATE item i
SET i.brandId = (SELECT t.taxonomyId
FROM taxonomy t
WHERE t.taxonomyName = (SELECT distinct b.brandName
FROM brand b
WHERE b.brandId = i.brandId
AND b.companyId = 9 limit 1)
AND t.taxonomyType = 'brand'
AND t.companyId = 9 limit 1)
WHERE i.companyId = 9
但我会尝试弄清楚如何在where子句中添加一些内容,以确保只返回一行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.