2014-10-30 62 views
0

這是我的查詢加入一個表的多個列到另一個表的單個列單查詢

select u.FirstName as AssignedBy, u1.FirstName as RespondedBy, u2.FirstName as ClosedBy 
from Messages M 
left join User u on isnull(M.AssignedBy, 0) = u.UserId  
left join User u1 on isnull(M.RespondedBy, 0) = u1.UserId 
left join User u2 on isnull(M.closedby, 0) = u2.UserId 

是否有可能寫在一個查詢中加入?我想提高查詢的性能,所以我不想讓3個連接在單個連接中嘗試,因爲我的用戶表有很多記錄。我有兩個表上的所有索引。我試圖

select u.FirstName as AssignedBy, u.FirstName as RespondedBy, u.FirstName as ClosedBy 
from Messages M 
left join User u on 
(isnull(M.AssignedBy, 0) = u.UserId or isnull(M.RespondedBy, 0) = u.UserId or isnull(M.closedby, 0) = u.UserId) 

但此查詢給出了,因爲我有這在所有三個連接列記錄多行不正確的輸出。有沒有其他辦法可以達到同樣的效果?

+0

你的表現有多糟糕?你可以用查詢的執行計劃編輯你的問題嗎? – 2014-10-30 11:20:29

回答

1

您的原始查詢看起來很好。如果你有User(UserId)或更好的指數User(UserId, FirstName)那麼我會認爲表現會很好。

使用orjoin條件通常會使性能變差而不是更好。

您的問題可能很簡單,就是Messages表的大小。返回非常大的結果集可能需要一段時間。

+0

是戈登,我的桌子確實很大,但我不能幫助它,所以試圖優化其他查詢。我有UserId上的索引。 – Hitesh 2014-10-30 11:41:17

1

我不認爲有一個'更好'的方法來做到這一點。我建議的唯一的建議是在JOIN中構建ISNULL(),因爲它並沒有真正起到任何作用,但可能會混淆優化器。 查詢,因爲它是不「需要」,你對用戶表適當的索引,但我假設UserId領域已經是說表的PK ...

select u.FirstName as AssignedBy, 
     u1.FirstName as RespondedBy, 
     u2.FirstName as ClosedBy 
from Messages M 
left join User u on M.AssignedBy = u.UserId  
left join User u1 on M.RespondedBy = u1.UserId 
left join User u2 on M.closedby = u2.UserId 

是多麼糟糕的表現呢?你確定鏈接到用戶表是罪魁禍首嗎? (我猜你還通過在Messages表上具有其他謂詞來限制查詢的結果;例如,通過僅需要打開的消息,或最後的100個消息等等......)

(查詢計劃可能很有趣)

+0

我不確定用戶表是罪魁禍首,在消息表中有大量數據。我限制了查詢的結果,也有很多過濾結果的條件,但我想知道我可以指定查詢的這一部分嗎? – Hitesh 2014-10-30 11:44:56

+0

在這種情況下,我只是首先關注'其他'條件; (三)加入到用戶表看起來好,因爲它是恕我直言。就像我所說的,查看查詢執行計劃並查看「重」部分的位置。 – deroby 2014-10-30 12:07:45

+0

好的,非常感謝您的時間deroby – Hitesh 2014-10-30 12:09:32