Sql 修改或提高以下方面的效率';右外连接';查询到内部联接?

Sql 修改或提高以下方面的效率';右外连接';查询到内部联接?,sql,tsql,Sql,Tsql,我正在努力提高一些查询的效率。由于知识的限制,我一直使用RightOuterJoin从多个表中引入完整的数据集,然后通过where语句将它们剔除。然而,由于我想将“聚集索引”添加到提供模式绑定视图的follow查询中,我只是想知道是否有办法将下面的右外部联接转换为“内部联接”,以便创建索引以减少加载时间 在过去的2-3天里,我一直在这个街区上敲打我的头,任何建议都将不胜感激 表1显示了客户信息 表2是由表1和表3中的复合键组成的连接表 表3显示了帐户信息 我已经尝试重新安排它,以便将一些

我正在努力提高一些查询的效率。由于知识的限制,我一直使用RightOuterJoin从多个表中引入完整的数据集,然后通过where语句将它们剔除。然而,由于我想将“聚集索引”添加到提供模式绑定视图的follow查询中,我只是想知道是否有办法将下面的右外部联接转换为“内部联接”,以便创建索引以减少加载时间

在过去的2-3天里,我一直在这个街区上敲打我的头,任何建议都将不胜感激

  • 表1显示了客户信息
  • 表2是由表1和表3中的复合键组成的连接表
  • 表3显示了帐户信息


我已经尝试重新安排它,以便将一些where条件加入到连接中,正如我在一些文章中所看到的那样(这显然会在开始时限制数据大小),这据说可以提高效率,但在查看之前和之后的“实时查询统计信息”之后,似乎没有太大区别。示例如下:



你没有提供足够的信息,但我认为这可能会有所帮助。试一试:

SELECT * 
FROM dbo.Table1 cd --ClientData
INNER JOIN dbo.Table2 jd --Junction Data
    ON cd.[Client ID] = jd.[Client ID] 
INNER JOIN dbo.Table3 ai --AccountInformation
    ON jd.[Account ID] = ai.[Account ID]
LEFT JOIN dbo.Table4 ao --AccountOfficer 
    ON jd.[Account Officer] = ao.FullName 
WHERE (jd.[Client Type] LIKE '%Customer 1%') 
AND (ai.ServiceDescription NOT LIKE '%Nil%') 
AND (jd.[Indicative outcome] IS NULL) 
AND (jd.[Finalised outcome] IS NULL) 
AND (jd.Outcome IS NULL) 
AND (jd.ReviewOutcome IS NULL) 
AND (ai.[Account Type] = 15) 
AND (ai.AccountReviewComplete = 1)
一些提示:

  • 使用表别名。这使它更容易阅读和理解
  • 内部联接将仅返回具有匹配链接行的行
  • 我为这个官员使用了一个
    左连接
    ,因为它名字上的链接可能是错误的(拼写错误!),否则你可能会漏掉行
  • LIKE
    与前导的
    %
    一起使用将不允许索引,并使查询速度变慢。如果有可能,您应该用确定的数据集替换
    客户端类型
    服务描述
    (如果可能,使用目录表)

右连接和左连接的混合使得这些查询很难理解。事实上,一些数据库专家更倾向于完全忽略表4(我也同意这一点)。。就我个人而言,我宁愿只使用内部联接。。但似乎无法获得我想要的数据集,只有内部联接当前左联接和右联接是彼此的镜像。内部联接是一种不同类型的联接-因为当联接条件匹配时,它只返回两个表中的行-而当联接条件匹配时,左联接将返回左表中的所有行,而只返回右表中的行-因此,不能简单地将外部联接替换为内部联接并期望相同的结果如果您将示例数据发布为+和所需结果,请帮助回答问题。你的质疑毫无意义。您正在检查驱动程序表中的
右连接
NULL
值。我建议您忘记存在
右连接
,只使用
左连接
。嗨,Shnugo!您的连接工作得很好,但是服务器上从连接表(jd)到Account Officer表(ao)的左连接会在我保存查询后自动更正为左外部连接。我认为这是因为我们的数据设置方式。然而,这比我5个多小时的反复试验更接近我所追求的结果。。非常感谢您的意见!:)@肖尼·高尔德会帮助你的。是一本关于连接类型的好书。您会发现,
左连接
左外连接
是等价的。如果这解决了你的问题,那么最好接受答案(在计票台下方勾选)。这将标记此问题已解决,并将向您和我的帐户支付点数。一旦你自己超过了15分,你会被额外要求对有帮助的贡献进行投票。这就是所谓的thx。快乐编码!
FROM dbo.Table1 
RIGHT OUTER JOIN dbo.Table2 
    ON dbo.Table1.[Client ID] = dbo.Table2.[Client ID] 
LEFT OUTER JOIN dbo.Table4 
    ON dbo.Table2.[Account Officer] = dbo.Table4.FullName 
RIGHT OUTER JOIN dbo.Table3 
    ON dbo.Table2.[Account ID] = dbo.Table3.[Account ID] 
    AND (dbo.Table3.[Account Type] = 15) 
    AND (dbo.Table3.AccountReviewComplete = 1)

WHERE (dbo.Table2.[Client Type] LIKE '%Customer 1%') 
AND (dbo.Table3.ServiceDescription NOT LIKE '%Nil%') 
AND (dbo.Table2.[Indicative outcome] IS NULL) 
AND (dbo.Table2.[Finalised outcome] IS NULL) 
AND (dbo.Table2.Outcome IS NULL) 
AND (dbo.Table2.ReviewOutcome IS NULL)
SELECT * 
FROM dbo.Table1 cd --ClientData
INNER JOIN dbo.Table2 jd --Junction Data
    ON cd.[Client ID] = jd.[Client ID] 
INNER JOIN dbo.Table3 ai --AccountInformation
    ON jd.[Account ID] = ai.[Account ID]
LEFT JOIN dbo.Table4 ao --AccountOfficer 
    ON jd.[Account Officer] = ao.FullName 
WHERE (jd.[Client Type] LIKE '%Customer 1%') 
AND (ai.ServiceDescription NOT LIKE '%Nil%') 
AND (jd.[Indicative outcome] IS NULL) 
AND (jd.[Finalised outcome] IS NULL) 
AND (jd.Outcome IS NULL) 
AND (jd.ReviewOutcome IS NULL) 
AND (ai.[Account Type] = 15) 
AND (ai.AccountReviewComplete = 1)