我遇到了一些情况,我的初级SQL经验已经达到了它的匹配。
我有一个查询
SELECT a.One,
a.Two,
a.Three,
a.Four,
b.One,
b.Two
FROM table1 a
INNER JOIN table2 b on b.Four = a.Nine
and b.Six like a.One
and b.Seven like b.Two
当我查看查询计划时,我看到我正在浏览table2中的每一行(我感到很惊讶)。内部联接如何根据首先执行的内容工作?它是否将三列组合为连接?或者它与第一列连接,然后是第二列,然后是第三列。
有没有更好的方法来编写此查询?
答案 0 :(得分:2)
问题是索引只能用于一次like 'pattern%'
比较。这是不等式,因此索引使用在第一个停止。
通过将查询更改为union
:
SELECT a.One, a.Two, a.Three, a.Four, b.One, b.Two
FROM table1 a INNER JOIN
table2 b
ON b.Four = a.Nine and b.Six like a.One
UNION
SELECT a.One, a.Two, a.Three, a.Four, b.One, b.Two
FROM table1 a INNER JOIN
table2 b
ON b.Four = a.Nine and bb.Seven like b.Two;
然后,在a(Nine, One)
和b(Four, Two)
上设置索引。虽然这两个子查询应该使用索引,但是可能会为中间结果获得大量匹配,从而减慢查询速度。