存在子查询的SQL如何使用Hints指定关联顺序

【 TiDB 版本】V6.5.4

SELECT 
t1.*
FROM t1
JOIN (
    SELECT *
    FROM table2
    WHERE condition
) AS t2 ON t1.id = t2.id
join t3 ON t1.id = t3.id
join t4 on t2.id = t4.id

如何通过Hints指定关联顺序?如指定的关联顺序为:t2(子查询别名), t4 ,t1 ,t3 。

这种为什么要用hint?不是应该调整语句顺序么

## Join 顺序
这里可能有你需要的帮助信息

sql为啥要这么写呀,是有业务上的考虑吗

SELECT
/*+ LEADING(t2, t4,t1,t3) / t1.
FROM t1
JOIN (
SELECT *
FROM table2
WHERE condition
) AS t2 ON t1.id = t2.id
join t3 ON t1.id = t3.id
join t4 on t2.id = t4.id
这样

t2表为子查询结果的别名,leading里直接指定不生效

SELECT
/*+ LEADING(t2, t4,t1,t3) / t1.
FROM t1
JOIN table2 t2
ON t1.id = t2.id
WHERE condition
join t3 ON t1.id = t3.id
join t4 on t2.id = t4.id

这么写?

大概明白你意思,你的意思是主动把子查询去掉,但我主要还是想问的是在有子查询的情况下如何指定关联顺序?

没看懂这几个join是干嘛的

如果要按照指定的顺序执行join,可以考虑一下straight join的方式来指定

1 个赞
select /*+ STRAIGHT_JOIN() */ t1.*  
from (SELECT *
    FROM table2
    WHERE condition)  t2,t4,t1,t3

像这样hint一下看看是否可以。

1 个赞

虽然需要改下下SQL写的顺序,但是STRAIGHT_JOIN() 这种方式确实一种好思路;之前一直在考虑leading,但是leading目前确实无法实现指定这种带子查询的关联顺序。

1 个赞