2012-12-17 169 views
0

我有這個查詢下面,其工作正常,我得到了我所需要的。我需要知道的是,這是正確的方式來寫這個查詢,或者有什麼辦法縮短它?有什麼辦法可以縮短這個SQL Server查詢嗎?

我有4張表,第1張有分行信息,第2張有客戶信息,第3張有工程師信息,第4張有服務呼叫信息。

在服務調用表,3列匹配的有3名不同的工程師的名字

下面是該查詢

SELECT 
    B.BranchName, C.Name AS CustomerName,D.FullName AS CallOpenedBy, 
    A.CallOpenTime, A.CallMode, A.CallType, A.ReportedBy, 
    A.ReportedVia, A.ReportedProblem, 
    A.MaterialsReceived, A.MisComments, A.CallPriority, A.EstimatedAmount, 
    E.FullName AS EngineerName, 
    A.ActionTaken, A.CallClosedTime, 
    F.FullName AS CallClosedBy, A.Status, 
    A.Amount 
FROM 
    TblServiceCalls A 
INNER JOIN 
    TblBranchInfo B ON A.BranchID = B.BranchID 
INNER JOIN 
    TblMainMaster C ON A.MasterID = C.MasterID 
INNER JOIN 
    TblUserProfiles D ON A.CallOpenedBy = D.UserProID 
INNER JOIN 
    TblUserProfiles E ON A.Engineer = E.UserProID 
INNER JOIN 
    TblUserProfiles F ON A.CallClosedBy = F.UserProID 

我可縮短在過去的3行的查詢?謝謝你們提前:)

回答

3

不,你在結果集中使用D,EF,所以你必須加入這些表。您只能從結果中刪除諸如D.FullName AS CallOpenedByE.FullName AS
EngineerName
F.FullName AS CallClosedBy之類的內容。


補充說明(和我敢打賭,你問這個問題的最初原因),但是如果呼叫尚未關閉,A.CallClosedBy沒有被指派給該行會被排除在F.UserProID值從結果。

如果這3個表中的任何一個在鏈接的3列中可能沒有目標表中的相應記錄,或者可能爲空,則應該使用LEFT OUTER JOIN

這裏是我會怎麼做

Select B.BranchName, C.Name AS CustomerName,IsNull(D.FullName, '(Not Assigned)') AS CallOpenedBy, 
A.CallOpenTime,A.CallMode, A.CallType,A.ReportedBy, A.ReportedVia, A.ReportedProblem, 
A.MaterialsReceived, A.MisComments,A.CallPriority,A.EstimatedAmount,IsNull(E.FullName, '(Not Assigned)') AS   
EngineerName, A.ActionTaken, A.CallClosedTime,IsNull(F.FullName, '(Not Assigned)') AS CallClosedBy, A.Status, 
A.Amount From TblServiceCalls A 
INNER JOIN TblBranchInfo B ON A.BranchID = B.BranchID 
INNER JOIN TblMainMaster C ON A.MasterID = C.MasterID 
LEFT OUTER JOIN TblUserProfiles D ON A.CallOpenedBy = D.UserProID 
LEFT OUTER JOIN TblUserProfiles E ON A.Engineer = E.UserProID 
LEFT OUTER JOIN TblUserProfiles F ON A.CallClosedBy = F.UserProID 

現在,如果值是NULL或記錄不中目標表中存在,它會說在輸出(Not Assigned),而不是排除該行。

+0

謝謝,你不需要打賭,其實我沒有考慮過那部分,如果電話還沒有關閉!並非常感謝這個好的解釋。祝你有美好的一天 –