如何在同一个表上避免多个连接?

时间:2012-12-26 00:42:14

标签: sql sql-server sql-server-2008 tsql

我想知道如何只用一个左连接或其他任何需要较少连接的东西来避免所有这些左连接?

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 :(得分:2)

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

  1. 直接将数据写入适当的列;或
  2. 拥有您以后批量更新的空列
  3. 您的问题背景不多。所以很难给出你特定问题的绝对答案。但通常这将是你问题的答案。

    您不应该害怕加入,如果性能有问题,建议使用关键字段的索引,和/或使用视图(具体与否)和/或分区以及任何其他性能增强工具

    <强>更新

    @ Konstantin-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
    

    然而,这会导致记录倍增,如果您随后可以使用您的应用程序进行转移,则不会出现问题,尽管这不会提供有关使用的关系的信息。因此,需要更改模式,规范化SectionAUnresolved表。

     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 {director,rm,rep,css,css2}
    • “ct.Unresolvedid = a.id” - 将新的SectionAUnresolved_countTypes表链接到单个SectionAUnresolved行

    将联接减少到2,并允许更多“countTypes”而不增加联接数或任何架构更改。

    <强>更新

    感谢@ Conrad-Flix,您可以使用case语句来确定为返回的每条记录使用的连接(请参阅上面的第一个代码段)。这样做意味着您不必进一步规范化SecionAUnresolved表,但是您可能仍需要这样做,具体取决于性能。

    从我的知识案例中,语句没有编入索引,并且可能需要物化视图索引进行优化。正常化仍然是一个更好的结构改进,IMO。

答案 1 :(得分:0)

简短的回答是“不”。

...因为您想要的数据位于不同的行中,您必须加入才能获得它。没有绕过它。