0

以下にこのクエリがあり、正常に機能しており、必要なものを取得しています。私が知る必要があるのは、このクエリをこのように記述する正しい方法ですか、それとも短縮する方法はありますか?

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 行に短縮できますか? よろしくお願いします:)

4

1 に答える 1

3

いいえ、できません。結果セットでDE、およびを使用しFているため、これらのテーブルを結合する必要があります。D.FullName AS CallOpenedBy結果からandなどを削除した場合にのみ、それらを削除できます。E.FullName AS
EngineerName
F.FullName AS CallClosedBy


補足として(そして、あなたがこの質問をした最初の理由に違いない)、しかし、コールがまだクローズされA.CallClosedByておらず、行の値に割り当てられていない場合はF.UserProID、結果から除外されます。

LEFT OUTER JOINリンク先の 3 つの列のいずれかが宛先テーブルに対応するレコードを持っていないか、null である可能性がある場合は、これらの 3 つのテーブルに使用する必要があります。

これが私がそれを行う方法です

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)、行を除外する代わりに出力に表示されます。

于 2012-12-17T04:44:59.543 に答える