【发布时间】:2015-11-12 19:01:38
【问题描述】:
我需要使用第二个表中的字段“cdi”与第一个表中的 cdi 或 cd_cliente 连接 2 个表。我的意思是它可能匹配第一个表中的相同字段或 cd_cliente。
我原来的查询是
select
a.cd_cliente, a.cdi as cdi_cli,b.*
from
clientes a
left join
rightTable b on a.cdi = b.cdi or a.cd_cliente = b.cdi
但是因为太费时间,我改成:
Select a.cd_cliente, a.cdi, b.*
from clientes a
left join
(select
a.cd_cliente, a.cdi as cdi_cli, b.*
from
clientes a
inner join
rightTable b on a.cdi = b.cdi
union
select
a.cd_cliente, a.cdi as cdi_cli, b.*
from
clientes a
inner join
rightTable b on a.cd_cliente = b.cdi) b
on a.cd_cliente=b.cd_cliente
而且花费的时间更少。我不确定结果是否相同。如果是这样,为什么第二次查询所花费的时间要少得多?
【问题讨论】:
-
您需要发布执行计划和索引以便我们帮助您。我的猜测是第一个使用表扫描,而两个中的一个是一个巨大的表,因此需要很多时间
-
@hatchet,不是重复的。链接的问题有两个意思相同的陈述。在这个问题中,这两个陈述是不等价的。
-
首先使用
COUNT()比较两个结果,看看是否返回相同的行数。这样我们就可以确定是否返回相同的结果。还请包括您的执行计划。 stackoverflow.com/questions/7359702/…, -
@JuanCarlosOropeza,我无法运行第一个查询来计算行数。运行需要 30 分钟以上。
标签: sql sql-server performance join