【问题标题】:mysql update rows of column in second table from column in first table where another column in first table matches column in second tablemysql从第一个表中的列更新第二个表中的列行,其中第一个表中的另一列与第二个表中的列匹配
【发布时间】:2014-08-11 19:50:24
【问题描述】:

我的标题可能有点混乱,但这基本上是我想做的:

我有两张桌子:

表 1 = 网站

Columns: SiteID    SiteName    Address
           1       Germany     123 A Street
           2       Poland      234 B Street
           3       France      354 F Street
           4       England     643 C Street
           5       Russia      968 G Street

表 2 = Site_New

Columns: SiteID    SiteName    Address
           1       Germany
           2       France
           3       Russia

我不想用表 1 中的地址更新表 2 中的地址列,其中表 2 中的站点名称 = 表 1 中的站点名称。如您所见,表 1 中有一些站点不在表 2 中,所以我不关心将这些地址复制到表 2。

我正在尝试这段代码:

update Site_New set Address = (select Site.Address from Site where Site_New.SiteName=Site.SiteName)

但我收到错误代码 1242:“子查询返回超过 1 行。”

知道如何做到这一点吗?

【问题讨论】:

    标签: mysql sql sql-update sql-insert insert-select


    【解决方案1】:

    你最好使用update/join语法:

    update Site_New sn join
           Site s
           on sn.SiteName = s.SiteName
        set sn.Address = s.Address;
    

    但是,根据您的示例数据,您的相关子查询不应导致此类错误。

    也许join 应该在SiteId 而不是SiteName

    update Site_New sn join
           Site s
           on sn.SiteId = s.SiteId
        set sn.Address = s.Address;
    

    【讨论】:

    • 谢谢戈登!你的第一个 sql 语句正是我想要的。加入站点 ID 对我来说不起作用,因为表 1 中的站点 ID 与表 2 不同。我应该在我的示例中展示这一点,但我只是想通过 SiteName 加入,结果证明它工作得很好。再次感谢!并感谢大家的快速回答!
    【解决方案2】:

    您需要像这样对更新进行选择

    UPDATE site_new sn,
    (   SELECT 
            sn1.address as _address, sn1.sitename as _sitename
        FROM site_new sn1
        JOIN site s on s.sitename = sn1.sitename
    ) t
    SET sn.address = t._address 
    WHERE sn.sitename = t._sitename
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 2012-08-18
      • 1970-01-01
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多