能否避免多次关联Date_Table?求SQL查询优化方案
SQL查询优化方案
针对你的需求——从Agreement表中返回对应Date_Table里最大date_value的记录(仅一行),以下是几种更简洁高效的优化方案,同时适配Date_Table中ID与date_value不按升序排列的场景:
方案1:直接关联排序取首行
这是最直观的写法,适合仅需单条结果的场景,性能优于多层嵌套子查询:
SELECT a.* FROM Agreement a JOIN Date_Table dt ON a.dim_date_id = dt.id ORDER BY dt.date_value DESC LIMIT 1;
逻辑:将两张表关联后,按date_value降序排序,直接取第一行即为对应最大日期的记录。
方案2:窗口函数(支持窗口函数的数据库适用)
如果存在多条Agreement记录对应同一个最大date_value,可以用窗口函数灵活控制返回结果:
SELECT * FROM ( SELECT a.*, -- 若需返回所有同最大日期的记录用RANK(),仅需任意一行用ROW_NUMBER() RANK() OVER(ORDER BY dt.date_value DESC) AS rank_num FROM Agreement a JOIN Date_Table dt ON a.dim_date_id = dt.id ) ranked_data WHERE rank_num = 1;
逻辑:通过窗口函数给每条记录按date_value降序排名,筛选排名为1的记录。
方案3:简化嵌套子查询
相比原查询减少一层嵌套,直接在子查询中定位最大日期对应的ID:
SELECT a.* FROM Agreement a WHERE a.dim_date_id = ( SELECT dt.id FROM Date_Table dt JOIN Agreement a2 ON dt.id = a2.dim_date_id ORDER BY dt.date_value DESC LIMIT 1 );
逻辑:子查询中先找到关联Agreement的最大date_value对应的ID,再用该ID匹配Agreement表获取完整记录。
原查询的问题在于多层嵌套子查询增加了执行复杂度,优化后的方案要么简化层级,要么利用排序/窗口函数的高效执行逻辑,同时保持逻辑清晰,完全适配你的业务场景。
内容的提问来源于stack exchange,提问作者BriAnna
相关产品推荐
相关产品推荐

