运行 带连接的查询的替代方法

Alternative way to run a query with join

我有以下查询:

select m.name, m.surname,m.teacher,
c.classroom,c.floor
from table1 as m 
inner join table2 as c
on (m.name=c.name or m.surname = c.surname);

但是执行查询需要很多时间。我想问问有没有其他的方法运行呢

在我停止查询之前,查询尝试获取的行也是 ~47b。

如果查询执行的是交叉连接而不是内部连接,则此结果是合理的。

每个 table 有 14m 行。

ORs 在 ON 子句中确实减慢了速度。您可以使用两个 LEFT JOINs:

select m.name, m.surname, m.teacher,
       coalesce(cn.classroom, cs.classroom) as classroom,
       coalesce(cn.floor, cs.floor) as floor
from table1 m left join
     table2 cn
     on m.name = cn.name left join
     table2 cs
     on m.surname = cs.surname
where cn.name is not null or cs.surname is not null

运行 使用 OR 运算符的连接查询导致 none-DBMS 的最佳执行计划。

试试这个:

select m.name, m.surname,m.teacher,c.classroom,c.floor 
from table1 m inner join table2 as c 
on m.name = c.name 
UNION
select m.name  , m.surname,m.teacher,c.classroom,c.floor
from table1 m inner join table2 as c 
on m.surname = c.surname 

考虑到您必须在两个表上声明名称和姓氏的索引