在这个SQL查询中进行多连接的更好方法是什么?

时间:2017-06-14 18:52:37

标签: sql sql-server join

我正在尝试从表(a.table)中提取数据以加入另一个表(b.table)。对我来说,我需要加入第三个表(c.table)来引用表Plan_Code和Policy_Riders。请参阅以下代码

USE [CDS]
GO

SELECT riders.ExpiryDt--
      ,riders.TerminationDt
      ,[ModalPremium]--
      ,plan_code
  FROM a.table as riders

  JOIN c.table as policy
  ON policy.Policy_Num = riders.Policy_Num


 JOIN b.table AS plan_code
  on policy.Plan_Code_ID = plan_code.Plan_Code_ID

WHERE plan_code.Plan_Code LIKE '%EIUL3%' 
OR plan_code.Plan_Code LIKE '%LBIUL%'
OR plan_code.Plan_Code LIKE '%MEIUL3%'  
GO

对于我从b.table到输出的字段名称Plan_code,我需要先将a.table加入到c.table,然后将c.table加入b.table。我的问题是,是否有更好的方法来处理此查询以更好地在三个表之间进行连接?任何帮助,将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

首先,使用派生表作为过滤器:

...
JOIN (SELECT columns
      FROM b.table
      WHERE Plan_Code LIKE '%EIUL3%' 
         OR Plan_Code LIKE '%LBIUL%'
         OR Plan_Code LIKE '%MEIUL3%'
     ) AS plan_code ON policy.Plan_Code_ID = plan_code.Plan_Code_ID

这通常会确保将这些过滤器应用于最小的数据集,而不是在所有表连接之后。另一个选择是使上面的临时表,然后加入它。相同的概念,只是帮助优化器有效地工作。在较小的查询中,您将看到没有区别,但在较大的查询中(特别是那些像这样的,使用单个表中的许多过滤器),它将是白天和黑夜。

其次,特别是你的过滤器。使用带有正面和背面通配符LIKE的{​​{1}}并不好。它无法使用索引。如果可能,请使用一个%ex%或另一个ex%

除此之外,您的联接很好,并且是从每个表中获取列的正确方法。