Mysql 如何在FROM子句中更新目标表?
我准备了以下SQL语句,以便用主表对应行的id更新临时表的字段master_id。主控形状包含因其位置而唯一的对象。因此,如果需要,最多应返回一个id 更新登台 设置主\u id= 选择m.id 来自m大师,s 其中m.lat=s.lat m.lon=s.lon ; 但是,查询失败,因为无法在FROM子句中为更新指定目标表“暂存”。我怎样才能解决这个问题 此外,我认为可以使用连接优化查询。如果你能帮上忙,那就太好了! 下面是我尝试连接两个表的步骤: 更新登台 内连接主节点m 在s.lat=m.lat上 s.lon=m.lon 设置s.master_id=m.id; 查询正常,0行受影响0.38秒 匹配的行:14976已更改:0警告:0 下一次尝试: 更新登台 内连接 选择id、lat、lon 从主人那里 作为m 在s.lat=m.lat上 s.lon=m.lon 设置s.master_id=m.id; 查询正常,0行受影响0.35秒 匹配的行:14976已更改:0警告:0 请注意,如果这会影响解决方案的语法,我将使用MySQLMysql 如何在FROM子句中更新目标表?,mysql,sql,ruby-on-rails,sql-update,Mysql,Sql,Ruby On Rails,Sql Update,我准备了以下SQL语句,以便用主表对应行的id更新临时表的字段master_id。主控形状包含因其位置而唯一的对象。因此,如果需要,最多应返回一个id 更新登台 设置主\u id= 选择m.id 来自m大师,s 其中m.lat=s.lat m.lon=s.lon ; 但是,查询失败,因为无法在FROM子句中为更新指定目标表“暂存”。我怎样才能解决这个问题 此外,我认为可以使用连接优化查询。如果你能帮上忙,那就太好了! 下面是我尝试连接两个表的步骤: 更新登台 内连接主节点m 在s.lat=m.l
要确认每个实际上都有匹配的行,您需要将表中的每个master_id设置为:
SELECT m.id
FROM master m, staging s
WHERE m.lat = s.lat
AND m.lon = s.lon
与您的想法相反,这将返回许多行。作为一个独立的查询来尝试吧!SQL无法神奇地理解,您只需要具有与正在更新的行匹配的lat和lon的m.id
SQLFiddle目前已关闭,因此我无法再次检查,但您可能需要以下内容:
UPDATE staging
SET master_id = (
SELECT m.id
FROM master m
-- where m.lat,m.lon are the lat,lon values **in the row you're updating**
WHERE m.lat = staging.lat
AND m.lon = staging.lon
);
请注意,这将在未找到匹配lat、lon的暂存中设置为NULL每个主_id值。这可能是问题,也可能不是问题。你是否需要和m.lon-s.lon,还是应该是和m.lon=s.lon?你能回顾一下你的答案吗?我看不出我的问题有什么不同。仍然没有更新任何行。可能没有一行具有与主表匹配的lat、lon。它们都匹配,因为它是表的副本。请参阅我更新的帖子。可能它们在master_id列中已经有了正确的值。若要获得更有用的帮助,请提供CREATE TABLE和INSERT语句,其中包含此查询不起作用的确切数据。您还搜索过internet以了解为什么会看到匹配的行:已更改:0例如: