/**/

我有两个表,一个称为shots,有9M行,另一个称为holes,有50K行. 我的数据库管理系统是SQLite.

目标是用holes的返回值替换shotsxyz的零值. 我有以下一整天都在运行的查询:

UPDATE shots
SET x = h.hole_x,
    y = h.hole_y,
    z = h.hole_z
FROM holes h
LEFT OUTER JOIN shots s
ON h.tournament = s.tournament
   AND h.course = s.course
   AND h.year = s.year
   AND h.round = s.round
   AND h.hole = s.hole
WHERE s.end = 'hole'
   AND s.x = '0.0'
   AND s.y ='0.0'
   AND s.z = '0.0'
   AND h.hole_x != '0.0'
   AND h.hole_y != '0.0'
   AND h.hole_z != '0.0'

我读到了here,Subquery可能比JOIN快260倍. 我如何重写我的查询以使其变得更快?

推荐答案

Your main problem here is that you are doing an unnecessary join to holes which you must remove.

以下是SQLite中类似JOIN的UPDATE语句的正确语法:

UPDATE shots AS s
SET x = h.hole_x,
    y = h.hole_y,
    z = h.hole_z
FROM holes AS h
WHERE h.tournament = s.tournament AND h.course = s.course 
  AND h.year = s.year AND h.round = s.round AND h.hole = s.hole
  AND s.end = 'hole' AND s.x = '0.0' AND s.y = '0.0' AND s.z = '0.0' 
  AND h.hole_x <> '0.0' AND h.hole_y <> '0.0' AND h.hole_z <> '0.0';

还有,为什么你要拿'0.0'美元做比较? 如果列hole_?是数字,那么您应该将它们与0.0或仅与0进行比较.

Sql相关问答推荐

snowflake交叉连接+横向压平

如何在不重复某些返回值的情况下使用两个内连接?

为什么 Sql server 中的 PIVOT 只输出一行?

如何倒置内存表的记录?

用于更复杂连接条件的旧 Oracle(非 ansi)连接语法 (Oracle 12c)

如何使用标量将值从一个字段复制到另一个字段?

如何在 Postgresql 中将字段转换为 JSON

如何只用一个 SQL 查询来解决这个练习?

Oracle SQL:从多个表中提取数据

如何获得 2 行之间的日期差异(对于每个相同的组)? SQL

在 SQL Developer Oracle 中,如何在不使用 MAX、LIMIT 或 ORDER BY 的情况下在 Product 表中找到最贵的产品?

为什么多表连接会产生重复行?

如何使用 Postgres information_schema 列出自定义类型

被引用表中没有与外键中的引用列列表匹配的主键或候选键

将日期转换为 YYYYMM 格式

SQLite 喜欢 % 和 _

CONCAT'ing NULL 字段

Postgres - 将行转置为列

有没有办法获取 SQL Server 中所有当前临时表的列表?

将 SQL 转换为带有 null 的 Linq 左连接