-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

谢谢您的指导!

4

2 回答 2

2

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

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

你的问题没有太多背景。因此,很难为您的特定问题提供绝对答案。但通常这将是您问题的答案。

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

更新

@Konstantin-Vasilcov 的想法看起来很有可能,虽然有点不正确(需要 or,not and)

 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,正常化仍然是更好的结构改进。

于 2012-12-26T00:53:21.737 回答
0

简短的回答是“不”。

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

于 2012-12-26T01:02:05.910 回答