繁体   English   中英

MySQL Update来自另一个表的连接信息

[英]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字段从brandtaxonomy所以我可以保留用于更新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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM