0

我准备了以下 SQL 语句,以便用表的相应行更新master_idstagingid字段mastermaster包含因其位置而唯一的对象。因此,如果有的话,最多应该返回一个 id。

UPDATE staging 
SET master_id = (
  SELECT m.id 
  FROM master m, staging s
  WHERE m.lat = s.lat 
  AND m.lon = s.lon
);

但是,查询失败并显示You can't specify target table 'staging' for update in FROM clause. 我怎样才能解决这个问题?

另外我认为查询可以使用JOIN. 如果您能对此有所帮助,那就太好了!
这是我加入两个表的尝试:

UPDATE staging s
INNER JOIN master m
ON s.lat = m.lat
AND s.lon = m.lon
SET s.master_id = m.id;

Query OK, 0 rows affected (0.38 sec)
Rows matched: 14976  Changed: 0  Warnings: 0

下次尝试:

UPDATE staging s 
INNER JOIN (
  SELECT id, lat, lon
  FROM master
) AS m
ON s.lat = m.lat
AND s.lon = m.lon
SET s.master_id = m.id;

Query OK, 0 rows affected (0.35 sec)
Rows matched: 14976  Changed: 0  Warnings: 0

请注意,如果这会影响您解决方案的语法,我正在使用 MySQL。


为了确认确实有匹配的行(每个 <-- 这是有意的),这个查询应该证明这个事实。

SELECT COUNT(*)
FROM master m, staging s
WHERE t.lat = s.lat
AND t.lon = s.lon;

+----------+
| count(*) |
+----------+
|    14976 |
+----------+
1 row in set (0.05 sec)
4

1 回答 1

0

您将表中的每个 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) 的每个 master_id 值设置为 NULL。这可能是也可能不是问题。

于 2013-08-10T15:59:48.750 回答