2

[企業機密情報またはグラフィックを削除]

私のデータベースにはこのような構造があります。従業員の名前に続いて、部門とオフィスの名前のリストを作成する必要があります。今では、このクエリに行き着きました:

ALTER PROCEDURE FilterEmpList
    @empName nvarchar(250) = null,
    @empDepID int = null,
    @empOfficeID int = null,
    @empPosID int = null    
AS 
BEGIN
SELECT 
    E.emp_id AS 'emp_id',
    E.emp_name AS 'emp_name',      
    (SELECT pos_name FROM Positions WHERE pos_id=EP.pos_id) AS 'pos_name',
    (SELECT dep_name FROM Departments WHERE dep_id=OS.dep_id) AS 'dep_name',
    (SELECT office_name FROM Offices WHERE office_id=OS.office_id) AS 'office_name'
FROM 
    Org_Structure OS INNER JOIN (Emp_Positions EP INNER JOIN Employees E ON EP.emp_id=E.emp_id) ON OS.chain_id=EP.chain_id      
WHERE 
    (E.emp_name LIKE '%'+@empName+'%' OR @empName IS NULL)
    AND
    (OS.dep_id = @empDepID OR @empDepID IS NULL)
    AND
    (OS.office_id = @empOfficeID OR @empOfficeID IS NULL)
    AND
    (EP.pos_id = @empPosID OR @empPosID IS NULL)
END

この方法でexec FilterEmpListを実行すると、エラーが発生します: Invalid object name 'EP' .

4

6 に答える 6

1

スコープ外でインライン選択テーブルを参照することはできません。次のような自然結合を使用することをお勧めします。

Select Emp_ID,Emp_Name,Dep_Name,Office_Name,Pos_Name
From Employees e
Join Emp_positions ep on ep.Emp_ID = e.Emp_ID
Join Org_Structue os on os.Chain_ID = ep.Chain_ID
Join Departments d on d.Dep_ID = os.Dep_ID
Join Offices o on o.office_ID = os.Office_ID
Join Positions p on p.Pos_ID = os.Pos_ID
Where (E.emp_name LIKE '%'+@empName+'%' OR @empName IS NULL)
    AND
    (OS.dep_id = @empDepID OR @empDepID IS NULL)
    AND
    (OS.office_id = @empOfficeID OR @empOfficeID IS NULL)
    AND
    (EP.pos_id = @empPosID OR @empPosID IS NULL)
于 2013-06-04T10:01:23.730 に答える
1

内部結合/結合に問題があります。クエリと ERD を見た後、これを探していると思いますが、

ALTER PROCEDURE FilterEmpList
    @empName nvarchar(250) = null,
    @empDepID int = null,
    @empOfficeID int = null,
    @empPosID int = null    
AS 
BEGIN
SELECT 
    E.emp_id AS 'emp_id',
    E.emp_name AS 'emp_name',      
    (SELECT pos_name FROM Positions WHERE pos_id=EP.pos_id) AS 'pos_name',
    (SELECT dep_name FROM Departments WHERE dep_id=OS.dep_id) AS 'dep_name',
    (SELECT office_name FROM Offices WHERE office_id=OS.office_id) AS 'office_name'
FROM 
    Org_Structure OS 
INNER JOIN Emp_Positions EP ON EP.ChainId ==  Emp_Positions.ChainId
INNER JOIN Employees E ON EP.emp_id=E.emp_id      
WHERE 
    (E.emp_name LIKE '%'+@empName+'%' OR @empName IS NULL)
    AND
    (OS.dep_id = @empDepID OR @empDepID IS NULL)
    AND
    (OS.office_id = @empOfficeID OR @empOfficeID IS NULL)
    AND
    (EP.pos_id = @empPosID OR @empPosID IS NULL)
END

また、エイリアスを読みやすくするようにしてください。

ありがとう

于 2013-06-04T10:02:49.497 に答える
0

EP を Org_structure テーブルに結合しようとしていますが、この EP は括弧内にあるため、クエリは失敗します。これは許可されていません。以下を試してください

ALTER PROCEDURE FilterEmpList
@empName nvarchar(250) = null,
@empDepID int = null,
@empOfficeID int = null,
@empPosID int = null    
 AS 
  BEGIN
 SELECT 
 E.emp_id AS 'emp_id',
 E.emp_name AS 'emp_name',      
(SELECT pos_name FROM Positions WHERE pos_id=EP.pos_id) AS 'pos_name',
(SELECT dep_name FROM Departments WHERE dep_id=OS.dep_id) AS 'dep_name',
(SELECT office_name FROM Offices WHERE office_id=OS.office_id) AS 'office_name'
FROM 
  Org_Structure OS 
  INNER JOIN Emp_Positions EP ON OS.chain_id=EP.chain_id 
  INNER JOIN Employees E ON EP.emp_id=E.emp_id     
WHERE 
 (E.emp_name LIKE '%'+@empName+'%' OR @empName IS NULL)
AND
 (OS.dep_id = @empDepID OR @empDepID IS NULL)
AND
 (OS.office_id = @empOfficeID OR @empOfficeID IS NULL)
AND
 (EP.pos_id = @empPosID OR @empPosID IS NULL)
END
于 2013-06-04T10:02:19.847 に答える
0

これはあなたに役立つ可能性があります-

ALTER PROCEDURE dbo.FilterEmpList
    @empName nvarchar(250) = null,
    @empDepID int = null,
    @empOfficeID int = null,
    @empPosID int = null    
AS 
BEGIN

    SELECT 
        E.emp_id,
        E.emp_name,      
        p.pos_name,
        d.dep_name,
        o.office_name
    FROM dbo.Org_Structure OS 
    JOIN dbo.Emp_Positions EP ON OS.chain_id=EP.chain_id  
    /*LEFT*/ JOIN dbo.Employees E ON EP.emp_id=E.emp_id 
    /*LEFT*/ JOIN dbo.Positions p ON p.pos_id=EP.pos_id
    /*LEFT*/ JOIN dbo.Departments d ON d.dep_id=OS.dep_id
    JOIN dbo.Offices o ON o.office_id=OS.office_id  
    WHERE (
              E.emp_name LIKE '%'+@empName+'%' 
            OR 
              @empName IS NULL
        )
        AND OS.dep_id = ISNULL(@empDepID, OS.dep_id)
        AND OS.office_id = ISNULL(@empOfficeID, OS.office_id)
        AND EP.pos_id = ISNULL(@empPosID, EP.pos_id)

END
于 2013-06-04T09:56:29.090 に答える
0

コードの一部が間違っていると思います。これを試して...

SELECT 
    E.emp_id AS 'emp_id',
    E.emp_name AS 'emp_name',      
    P.pos_name  AS 'pos_name',
    D.dep_name AS 'dep_name',
    O.office_name AS 'office_name'
FROM 
    Org_Structure OS 
    INNER JOIN Emp_Positions EP ON OS.chain_id=EP.chain_id 
    INNER JOIN Employees E ON EP.emp_id=E.emp_id    
    LEFT JOIN Positions P ON P.pos_id=EP.pos_id
    LEFT JOIN Departments D ON D.dep_id=OS.dep_id
    LEFT JOIN Offices O ON O.office_id=OS.office_id
WHERE 
    (E.emp_name LIKE '%'+@empName+'%' OR @empName IS NULL)
    AND
    (OS.dep_id = @empDepID OR @empDepID IS NULL)
    AND
    (COALESCE(O.office_id,@empOfficeID ) = @empOfficeID OR @empOfficeID IS NULL)
    AND
    (EP.pos_id = @empPosID OR @empPosID IS NULL)
于 2013-06-04T09:56:35.023 に答える
0

こんにちは、テーブルEMP_Positionsが存在することを確認しましたか?

于 2013-06-04T10:24:35.893 に答える