Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL语句:如何仅从一个表中选取一个值来更新另一个表?_Mysql_Sql_Sql Update - Fatal编程技术网

Mysql SQL语句:如何仅从一个表中选取一个值来更新另一个表?

Mysql SQL语句:如何仅从一个表中选取一个值来更新另一个表?,mysql,sql,sql-update,Mysql,Sql,Sql Update,我希望使用与同一代码匹配的表2的任何不同值更新表1,无论是哪一个或顺序(表2中的值不能多次拾取) +-------------++--------------+ |表1 | |表2| +-------------------+ +--------------+ |id |代码|值| |代码|值| +----+------+-------+ +------+-------+ |1 | A | |使用join,因为顺序无关紧要,所以我认为可以更改示例输出 UPDATE t

我希望使用与同一代码匹配的表2的任何不同值更新表1,无论是哪一个或顺序(表2中的值不能多次拾取)

+-------------++--------------+
|表1 | |表2|
+-------------------+      +--------------+
|id |代码|值| |代码|值|
+----+------+-------+      +------+-------+

|1 | A | |使用join,因为顺序无关紧要,所以我认为可以更改示例输出

    UPDATE table1 a 
    JOIN table2 b ON a.code= b.code 
    set a.value = b.value 
这需要窗口函数的魔力!不幸的是,你的MySQL版本是5.7;因此,更详细的解决方案如下:


您可以在此查看类似技术的说明。

使用OVER函数应该可以:

查询示例:

select id,code,value,rank() over (partition by code order by id asc) rank_ 
from dbo.table1;

select code,value,dense_rank() over (partition by code order by code,value asc) rank_ from dbo.table2;
UPDATE t 
SET t1.value = t2.value 
FROM (select id,code,value,rank() over (partition by code order by id asc) rank_ from dbo.table1) t1
inner join ( select code,value,dense_rank() over (partition by code order by code,value asc) rank_ from dbo.table2 ) t2
on t1.code = t2.code and t1.rank_ = t2.rank_
更新声明:

select id,code,value,rank() over (partition by code order by id asc) rank_ 
from dbo.table1;

select code,value,dense_rank() over (partition by code order by code,value asc) rank_ from dbo.table2;
UPDATE t 
SET t1.value = t2.value 
FROM (select id,code,value,rank() over (partition by code order by id asc) rank_ from dbo.table1) t1
inner join ( select code,value,dense_rank() over (partition by code order by code,value asc) rank_ from dbo.table2 ) t2
on t1.code = t2.code and t1.rank_ = t2.rank_
提供的声明在以下情况下有效:

  • @rn*被初始化为1而不是0(否则,行数*被编号为1两次)
  • 从表2中选择是不同的(因为(代码、值)对在表2中重复)
  • 声明应该是

    UPDATE 
    table1 AS t1 
    
    JOIN 
    
    (SELECT 
       dt1.id, 
       IF(@cd1 = dt1.code, @rn1 := @rn1 + 1, 1) AS row_num1, 
       @cd1 := dt1.code AS code,
     FROM (SELECT id, code FROM table1 ORDER BY code, id) AS dt1
     CROSS JOIN (SELECT @rn1 := 1, @cd1 := '') AS init1
    ) AS t2 
      ON t2.id = t1.id 
    
    JOIN 
    
    (SELECT 
       IF(@cd2 = dt2.code, @rn2 := @rn2 + 1, 1) AS row_num2, 
       @cd2 := dt2.code AS code, 
       dt2.value 
     FROM (SELECT DISTINCT code, value FROM table2 ORDER BY code) AS dt2
     CROSS JOIN (SELECT @rn2 := 1, @cd2 := '') AS init2
    ) AS t3 
      ON t3.row_num2 = t2.row_num1 AND 
         t3.code = t2.code 
    
    SET t1.value = t3.value 
    

    你为什么不选v1?您是否可以访问最新的MySQL版本(8.0.2及更高版本)?因为顺序无关紧要。MySQL 5.7在这里,您可以提供DB FIDLE或SQL FIDLE。我可以尝试进一步优化发布的解决方案。这将如何确保相同的值不会重复?这不起作用,不是因为从(选择id
    ,但因为它重复表2的值。按表2.code排序并使用变量跳过已使用的值如何?@guigoz我已修复语法错误。请尝试提供一个新的解决方案,这将帮助我处理数据并进一步优化和修复逻辑。关于第一点,行号将初始化为1对于不同的代码值,我相信这就是所需要的。尽管如此,如果不查看完整的数据,以及SQL/DB FIDLE,可能很难了解您的实际需求。对于不同的代码,row_num实际上初始化为1,使用
    if(…,…,1)
    ,这是可以的,但对于下一个相同的代码,如果@rn被初始化为0,则第行的num再次为1,如果(…,@rn:=@rn+1,…)