2012-12-13 36 views
0

我有一個問題,現在我沒有想法。在WHERE中重現有條件的LEFT JOIN行爲?

我正在做一些數據庫應用程序的優化。有一個叫幾百次,做這種查詢方法(Method_A):

SELECT 
A.a, 
ISNULL(A.b, 'Nothing') As alias_b 
ISNULL(B.a, 'N/A') as alias_c 
FROM A 
LEFT JOIN B on A.fk=B.fk AND B.a = 'SOME_KEY' 
WHERE A.c = 'SOME_OTHER_KEY' 

造成一列看起來像這樣:

[a  ][alias_b][ alias_c ] 
[ val_a ][ val_b ][val_c|'N/A'] 

我想,以優化做的我的代碼是在Method_A之前發出一個單一的請求,將所有數據取回並使Method_A過濾客戶端。 (它在.NET中編碼,我用DataSet替換OleDBConnection)

我怎麼能實現這種行爲?因爲如果我使用客戶端條件進行篩選,而不是在連接不返回任何內容的情況下獲得'N/A',那麼我就不會得到任何行,這是一個問題,因爲我仍然需要val_a和val_b

感謝您的幫助!

+0

你想擁有的一切都A''和'B'發送到客戶端獨立,然後在客戶端做的加入? – Matthew

+0

你怎麼做加入/過濾器客戶端,這是如何做一個左連接在LINQ http://stackoverflow.com/questions/700523/linq-to-sql-left-outer-join –

+0

我一直在尋找一個服務器端解決方案(在SELECT或WHERE),但是我認爲我不會選擇單獨檢索A和B並進行客戶端連接,對嗎? –

回答

0

你可以試試這個,基本上分爲兩種情況下,也有非匹配乙元素,當有搭配(和做一個內部連接),說不定就會有一個更清潔的執行計劃:

(SELECT A.a, 
     ISNULL(A.b, 'Nothing') As alias_b 
     'N/A' as alias_c 
FROM A 
WHERE A.c = 'SOME_OTHER_KEY' and 
    not exists (select B.fk FROM B WHERE A.fk=B.fk AND B.a = 'SOME_KEY') 
) 
UNION ALL 
(SELECT A.a 
     ISNULL(A.b, 'Nothing') As alias_b 
     B.a as alias_c 
FROM A, B 
WHERE A.c = 'SOME_OTHER_KEY' and 
     A.fk= B.fk and 
     B.a = 'SOME_KEY' 
) 

請注意,你需要以下指標:

  • A(C)
  • A(FK)
  • B(FK)
  • B(FK,A)
  • A(FK,C)
+0

對不起,延遲了,我在週末。如果知道'SOME_KEY',這個解決方案就可以工作,但是我想加載SOME_KEY的每個可能的值...對不起,現在我想了一會兒,在我的情況下,它可能不是技術上可能存在的。 : - /好吧,我想這畢竟是一個糟糕的問題...... –