1

次のようなストアド プロシージャを作成しています。

SELECT
    Positions.PositionId 
    ,Positions.Title
    ,Positions.Location
    ,Positions.Description
    ,Positions.MaximumSalary
    ,PositionsDepartments.Description Department
    ,PositionsSubDepartments.Description Subdepartment
    ,PositionsDepartments.DepartmentId DepartmentId
    ,PositionsSubDepartments.SubDepartmentId SubdepartmentId
    ,@TheRole TheRole
    ,@Essentials Essentials
    ,@Desirable Desirable
    ,Positions.Published
    ,Positions.LastUpdatedDate
    ,PositionsStatus.Description Status
FROM 
    Positions
    WITH (NOLOCK)
    INNER JOIN PositionsStatus ON Positions.StatusId = PositionsStatus.StatusId
    INNER JOIN PositionsSubDepartments ON Positions.SubDepartmentId = PositionsSubDepartments.SubDepartmentId
    INNER JOIN PositionsDepartments ON PositionsSubDepartments.DepartmentId = PositionsDepartments.DepartmentId
WHERE 
    Positions.PositionId = @PositionId

しかし、Positions.SubDepartmentId が null になる可能性があります。これは、期待しているすべてのデータを取得できないことを意味します。私はこれを試しましたが、重複したデータが戻ってきます:

SELECT 
    Positions.PositionId
    ,Positions.Title
    ,Positions.Location
    ,Positions.Description
    ,Positions.MaximumSalary
    ,PositionsDepartments.Description Department
    ,PositionsSubDepartments.Description Subdepartment
    ,PositionsDepartments.DepartmentId DepartmentId
    ,PositionsSubDepartments.SubDepartmentId SubdepartmentId
    ,@TheRole TheRole
    ,@Essentials Essentials
    ,@Desirable Desirable
    ,Positions.Published, Positions.LastUpdatedDate
    ,PositionsStatus.Description Status
FROM 
    Positions
    WITH (NOLOCK)
    INNER JOIN PositionsStatus ON Positions.StatusId = PositionsStatus.StatusId
    INNER JOIN PositionsSubDepartments ON Positions.SubDepartmentId = PositionsSubDepartments.SubDepartmentId OR ( Positions.SubDepartmentId IS NULL)
    INNER JOIN PositionsDepartments ON PositionsSubDepartments.DepartmentId = PositionsDepartments.DepartmentId 
WHERE 
    Positions.PositionId = @PositionId

私は何を間違っていますか?

4

3 に答える 3

3

エントリが null になる可能性がある場合は、左結合を使用する必要があります

SELECT
    Positions.[PositionId]
    ,Positions.[Title]
    ,Positions.[Location]
    ,Positions.[Description]
    ,Positions.[MaximumSalary]
    ,PositionsDepartments.[Description] Department
    ,PositionsSubDepartments.[Description] Subdepartment
    ,PositionsDepartments.[DepartmentId] DepartmentId
    ,PositionsSubDepartments.[SubDepartmentId] SubdepartmentId
    ,@TheRole TheRole
    ,@Essentials Essentials
    ,@Desirable Desirable
    ,Positions.[Published]
    ,Positions.[LastUpdatedDate]
    ,PositionsStatus.[Description] Status
FROM 
    Positions WITH (NOLOCK)
    INNER JOIN PositionsStatus ON Positions.StatusId = PositionsStatus.StatusId
    LEFT JOIN PositionsSubDepartments ON Positions.SubDepartmentId = PositionsSubDepartments.SubDepartmentId
    LEFT JOIN PositionsDepartments ON PositionsSubDepartments.DepartmentId = PositionsDepartments.DepartmentId 
WHERE 
    Positions.PositionId = @PositionId

以下も役に立つかもしれません: http://www.tutorialspoint.com/sql/sql-left-joins.htm

于 2013-11-07T12:11:22.357 に答える
2
select Positions.PositionId, Positions.Title, Positions.Location,Positions.Description,Positions.MaximumSalary,
PositionsDepartments.Description Department, PositionsSubDepartments.Description Subdepartment, PositionsDepartments.DepartmentId DepartmentId, PositionsSubDepartments.SubDepartmentId SubdepartmentId,
@TheRole TheRole, @Essentials Essentials, @Desirable Desirable,
Positions.Published, Positions.LastUpdatedDate, PositionsStatus.Description Status
FROM Positions
WITH (NOLOCK)
INNER JOIN PositionsStatus ON Positions.StatusId = PositionsStatus.StatusId
LEFT JOIN PositionsSubDepartments ON Positions.SubDepartmentId = PositionsSubDepartments.SubDepartmentId
LEFT JOIN PositionsDepartments ON PositionsSubDepartments.DepartmentId = PositionsDepartments.DepartmentId 
WHERE Positions.PositionId = @PositionId
于 2013-11-07T12:05:43.943 に答える