【发布时间】:2018-11-09 08:46:44
【问题描述】:
我有以下工作选择语句。
SELECT t1.id, t1.option_key, (
SELECT
t3.content AS option_value
FROM tblfoo t2
LEFT OUTER JOIN tblbar t3 ON( t3.refid = t2.id )
WHERE t2.id = t1.id
LIMIT 1
) AS option_value
FROM tblfoo t1
表结构如下所示:
| tblfoo |
+----+------------+--------------+
| id | option_key | option_value |
+----+------------+--------------+
| 1 | foo | NULL |
| 2 | bar | NULL |
| 3 | baz | NULL |
| tblbar |
+----+-----------------+
| id | refid | content |
+----+-----------------+
| 1 | 1 | value1 |
| 1 | 2 | value2 |
| 1 | 3 | value3 |
更新语句的结果应该是这样的:
| tblfoo |
+----+------------+--------------+
| id | option_key | option_value |
+----+------------+--------------+
| 1 | foo | value1 |
| 2 | bar | value2 |
| 3 | baz | value3 |
我想用来自content 和tblbar 的相关数据更新option_value 和tblfoo。不幸的是,tblbar 可能有多个具有相同值的refid 条目。这就是为什么子查询需要LIMIT 1(或GROUP BY t,id或DISTINCT)。
我发现,当我使用LIMIT 1 进行子查询而不是使用SELECT DISTINCT 进行子查询或结合GROUP BY t1.id 进行连接时,查询速度明显更快。所以在执行时间优化之后,我最终得到了上面的select语句。
源表还有一个问题,应该更新。 option_value 是一个实际字段,它也存在于源表中(但具有 NULL 值)。
我在尝试将上面优化的选择语句转换为更新语句时遇到的问题主要是我无法从子查询内部访问t1.id。
如何在不损失性能优化的情况下将select语句转换为update语句?
【问题讨论】:
-
哪些表/列正在更新哪些数据?
-
子查询中,为什么要加入table2和table3;相信你可以直接使用table3
-
显示您正在尝试更新的代码
-
@TimBiegeleisen 我已经用表格结构编辑了我的问题,并且更清楚地说明了应该更新哪些字段。
-
如果有重复值,你要使用哪一个?
标签: mysql sql sql-update subquery