【问题标题】:MySQL Update with distincted Join具有不同连接的 MySQL 更新
【发布时间】:2015-03-22 04:59:01
【问题描述】:

我有 2 张桌子:

CREATE TABLE `tmp1` (
    `c1` VARCHAR(50) NULL DEFAULT NULL,
    `c2` VARCHAR(50) NULL DEFAULT NULL
);

CREATE TABLE `tmp2` (
    `c1` VARCHAR(50) NULL DEFAULT NULL,
    `c2` VARCHAR(50) NULL DEFAULT NULL
);

c2 是主键。 我对 tmp1 有这样的值:

|| 1 || val1 ||
|| 2 || val2 ||
|| 2 || val3 ||

对于 tmp2:

|| 1 || val11 ||
|| 2 || val22 ||
|| 2 || val33 ||
|| 2 || val44 ||

我需要通过加入 c1 字段来更新 tmp2 以接收如下结果:

|| 1 || val1 ||
|| 2 || val2 ||
|| 2 || val3 ||
|| 2 || val44 ||

当我使用常规内部连接时,我会收到错误的结果:

|| 1 || val1 ||
|| 2 || val2 ||
|| 2 || *val2* ||
|| 2 || *val2* ||

我需要加入这样的更新:

|| 1 || val1 ||  ->(by c1)  || 1 || val11 ||
|| 2 || val2 ||  ->(by c1)  || 2 || val22 ||
|| 2 || val3 ||  ->(by c1)  || 2 || val33 ||

或者像这样(我觉得可能更真实)

|| 1 || val1 ||  ->(by c1)  || 1 || val11 ||
|| 2 || val2 ||  ->(by c1)  || 2 || val22 ||

所以在第二种情况下,我认为我需要将 tmp2 按 c1 分组,将 tmp1 按 c1 分组,然后只更新该组中的一行。

此选择返回我需要更新的内容:

select tmp1.c2, tmp2.c2 from tmp1
inner join tmp2 on tmp1.c1 = tmp2.c1 
group by tmp2.c1

|| val1 || val11 ||
|| val2 || val22 ||

【问题讨论】:

  • tmp2 的第一列相同时,它应该如何知道应该从tmp1 复制哪一行?您需要某种方式来区分行。
  • 不清楚你想要什么。 MySQL 根据 SQL 标准返回正确的结果(尽管很难说没有确切的查询)
  • 我认为更新一定是这样的。但这是错误的 sql:UPDATE tmp2 as up setup.c2 = (select tmp1.c2 from tmp1 inner join tmp2 as j on tmp1.c1 = j.c1 where up.c1 = tmp1.c1 group by j.c1)跨度>
  • 这也是错误的查询 =( UPDATE tmp2 as up JOIN (select ij.c2 as x, src.c2 as y from tmp1 as src inner join tmp2 as ij on src.c1 = ij.c1按 src.c1) 分组 ON up.c2 = x SET up.c2 = y

标签: mysql join sql-update


【解决方案1】:

我用这个查询解决了我的问题:

UPDATE tmp2 as up
JOIN (select ij.c2 as x, src.c2 as y from tmp1 as src
inner join tmp2 as ij on src.c1 = ij.c1 
group by src.c1) as sel ON up.c2 = sel.x
SET up.c2 = y

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 2021-12-16
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 2022-08-15
    • 2020-07-24
    相关资源
    最近更新 更多