【发布时间】: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