使用distinctedjoin更新MySQL
我有两张桌子:使用distinctedjoin更新MySQL,mysql,join,sql-update,Mysql,Join,Sql Update,我有两张桌子: 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 || val
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 || ->(by c1) || 1 || val11 ||
|| 2 || val2 || ->(by c1) || 2 || val22 ||
|| 2 || val3 || ->(by c1) || 2 || val33 ||
当我使用常规内部联接时,我将收到错误的结果:
|| 1 || val1 ||
|| 2 || val2 ||
|| 2 || *val2* ||
|| 2 || *val2* ||
我需要加入更新,如下所示:
|| 1 || val1 ||
|| 2 || val2 ||
|| 2 || val3 ||
|| 2 || val44 ||
|| 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 ||
我解决了此查询的问题:
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
当tmp2中的第一列相同时,它如何知道应该从tmp1复制哪一行?你需要一些区分行的方法。不清楚你想要什么。根据SQL标准,MySQL正在返回正确的结果,但是如果没有精确的查询,很难说更新一定是这样的。但这是错误的sql:更新tmp2为up set up.c2=从tmp1中选择tmp1.c2作为j在tmp1.c1=j.c1中,up.c1=tmp1.c1按j.c1分组这也是错误的查询=更新tmp2为up join从tmp1中选择ij.c2作为x,src.c2作为y在src.c1=ij.c1组中选择src.c1作为ij在up.c2=x set up.c2=y