sql - 将 JOIN 查询重写为子查询/更快的变体

标签 sql sqlite join sql-update

我有两张表,一张名为 shots,有 9m 行,一张名为 holes,有 50k 行。 我的 DBMS 是 SQLite。

目标是用以下值替换镜头xyz的零值从漏洞返回值。 我有一整天都在运行以下查询:

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 子查询 的速度比 JOIN 快 260 倍。 如何重写我的查询以使其变得更快?

最佳答案

这里的主要问题是您对必须删除的进行了不必要的连接。

这是 SQLite 中类似连接的 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 - 将 JOIN 查询重写为子查询/更快的变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73940128/

相关文章:

python - 在 MySQL 子查询中使用 Python 变量

MySQL聚合数据IN、OUT时间

python - 接口(interface)错误: Error binding parameter 0 - probably unsupported type when runing my django script

android - select 中的 Ormlite 子查询

mysql - 基于选择值的 SQL 列

sql - Oracle:如何在表中的 USER_TABLES.TABLE_NAME 上添加外键

sql - SSIS间歇性变量错误: The system cannot find the file specified

java - 向 TextView 和低速应用程序插入 49.000 个字符

android - Parse.com 相当于 SQL 连接

mysql - 多左连接的正确语法是什么?左表的条件是什么?