【发布时间】:2020-03-10 17:42:02
【问题描述】:
我有两张桌子。一个 Employee 键表和一个包含其工作位置的表。
EMPID EMPNAME
1234 James
9876 Kevin
4567 Elaine
EMPID EMPID_OLD LOCATION
1234 TORONTO
987610 9876 NEW YORK
4567 104567 CHICAGO
问题在于第二个表中的员工键不一致,并且分散在 EMPID 和 EMPID_OLD 列之间。
我编写了一个查询,其中涉及 LEFT JOIN 表达式中的“或”运算符。:
select empid, location
from emp m1
left join emp_location m2
on m2.empid = m1.empid OR m2.empid_old = m1.empid
此查询理论上有效,但运行大约需要 45 分钟。如果我删除“OR”表达式,运行只需 5 秒。
不能使用COALESCE 表达式,因为它匹配的第一个值可能不准确,因此它连接了它可以找到匹配的任何一个值,不一定是第一个。
有什么方法可以优化这个查询,而不必像下面那样分离连接?
这是我正在处理的大型查询的过度简化版本,因此显然试图避免同一个表的多个连接。
select m1.empid, coalesce(m2.location,m3.location)
from emp m1
left join emp_location m2
on m2.empid = m1.empid
left join emp_location m3
on m3.empid_old = m1.empid
【问题讨论】:
-
你的上一个版本是提高性能的方法。
-
" 如果我去掉“OR”表达式,运行只需要 5 秒。"对于 empid 和 empid_old?
-
emp_location是否同时在empid和empid_old上编入索引?重复的结果是可能的还是可取的?select e.empid, el.location from emp as e inner join emp_location as el on el.empid = e.empid union all select e.empid, el.location from emp as e inner join emp_location as el on el.empid_old = e.empid;可能会产生重复。将其更改为union会以牺牲排序为代价删除重复项。 -
是否有任何答案为您解决了问题?
标签: sql sql-server tsql join