我想知道如何只用一个左连接或其他任何需要较少连接的东西来避免所有这些左连接?
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
谢谢你的指导!
答案 0 :(得分:2)
要直接回答您的问题,您可以更改架构,以便从左连接表返回的数据包含在SectionAUnresolved中。您可以通过以下方式执行此操作:
您的问题背景不多。所以很难给出你特定问题的绝对答案。但通常这将是你问题的答案。
您不应该害怕加入,如果性能有问题,建议使用关键字段的索引,和/或使用视图(具体与否)和/或分区以及任何其他性能增强工具
<强>更新强>
@ 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
其中:
将联接减少到2,并允许更多“countTypes”而不增加联接数或任何架构更改。
<强>更新强>
感谢@ Conrad-Flix,您可以使用case语句来确定为返回的每条记录使用的连接(请参阅上面的第一个代码段)。这样做意味着您不必进一步规范化SecionAUnresolved表,但是您可能仍需要这样做,具体取决于性能。
从我的知识案例中,语句没有编入索引,并且可能需要物化视图索引进行优化。正常化仍然是一个更好的结构改进,IMO。
答案 1 :(得分:0)
简短的回答是“不”。
...因为您想要的数据位于不同的行中,您必须加入才能获得它。没有绕过它。