2012-12-26 56 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

簡單而簡單的答案是「否」。

...因爲你想要的數據存在於不同的行中,所以你必須加入才能得到它。沒有繞過它。

相關問題