2012-12-26 107 views
-3

我想知道如何才能避免所有这些左连接只有1个左连接,或其他任何需要较少连接的连接?我如何避免同一张桌子上的多个连接?

select colums 
    FROM [SectionAUnresolved] a 
    left join sectionanotmarkedcounts sdirector 
    on a.director=sdirector.employee 

    left join sectionanotmarkedcounts s_rm 
    on a.rm=s_rm.employee 

    left join sectionanotmarkedcounts s_rep 
    on a.rep=s_rep.employee 

    left join sectionanotmarkedcounts s_css 
    on a.css=s_css.employee 

    left join sectionanotmarkedcounts s_Css2 
    on a.css2=s_Css2.employee 

感谢您的指导!

+2

无法以其当前形式回答。 –

+0

你想用这些连接来达到什么目的?你期望的结果是什么? – horgh

+0

你能给我们一些关于数据库表结构等的更多细节吗?我们无法以当前形式回答您的问题 –

回答

2

要直接回答您的问题,您可以更改您的模式,以便您从左连接表中返回的数据包含在SectionAUnolved中。您可以通过以下方式执行此操作:

  1. 直接将数据写入相应的列;或
  2. 具有您稍后更新批量

没有对你的问题太多背景空列。所以很难给你一个绝对的答案你的特定问题。但通常这将是你的问题的答案。

你不应该害怕连接,如果性能是一个问题,关键字段的索引和/或视图(物化与否)和/或分区的使用以及任何数量的其他性能增强工具是推荐的。

更新

@康斯坦丁 - Vasilcov的想法看起来像一个很好的可能性,但稍不正确(要求或不和)

select colums 
    FROM [SectionAUnresolved] a 
    left join sectionanotmarkedcounts [all] 
    on a.director=[all].employee 
    or a.rm=[all].employee 
    or a.rep=[all].employee 
    or a.css=[all].employee 
    or a.css2=[all].employee 

但这会导致记录相乘,而不是问题,如果你随后可以与你的应用程序一起转动,虽然这不会提供关于使用什么关系的信息。因此,在您的模式中进行更改时,需要规范化您的SectionAnresolved表。

select ct.type, colums 
    FROM [SectionAUnresolved] a 
    left join SectionAUnresolved_countTypes ct 
    on ct.Unresolvedid = a.id 
    left join sectionanotmarkedcounts [all] 
    on ct.employee=[all].employee 

其中:

  • ct.type {主任,RM,代表,CSS,CSS2}
  • “ct.Unresolvedid = a.id” - 新SectionAUnresolved_countTypes表链接到单节未分解的行

将连接数减少为2,并允许更多“countTypes”而不增加连接数或任何模式更改。

更新

感谢@康拉德 - 费利克斯,你可以使用一个case语句来确定使用了什么联接为每个返回的记录(见上面我的第一个代码片段)。这样做意味着您不必进一步标准化SecionAUnresolved表,但是您可能仍需要这样做,具体取决于性能。

从我的知识中,case语句没有编入索引,并且可能需要物化视图索引以进行优化。正常化仍然是一个更好的结构改进,国际海事组织。

+0

*虽然这不会提供关于使用什么关系的信息。*您可以包括一系列的case语句以确定使用哪些关系。例如'CASE WHEN a.director = [all] .employee THEN 1 ELSE 0 END director,CASE WHEN a.rm = [all] .employee THEN 1 ELSE 0 END rm..' –

+0

添加回答,并注意更好的表单是:'情况是当Condition1 THEN Value1当Condition2 THEN Value2 END'更像一个Else-If结构,消除嵌套。有关更多示例,请参见[MSDN](http://msdn.microsoft.com/zh-cn/library/ms181765.aspx)。更新:只是意识到你有单独的领域,而不是嵌套的情况。我的假设和偏爱的方法是在一个字段中将Enumerated值返回到应用程序层。 – Todd

+0

我喜欢枚举值,但除非有确保director,rm,rep,css和cc2的值是不同的值,否则它需要是单独的字段或位字段。 –

0

简单而简单的答案是“否”。

...因为你想要的数据存在于不同的行中,所以你必须加入才能得到它。没有绕过它。

相关问题