如何从另一个表列返回表的详细信息

时间:2020-06-03 11:39:30

标签: sql-server tsql

我正在尝试使用一个部门名称和 返回特定部门的所有员工详细信息。

如果没有传入部门名称,则必须返回所有员工。

我正在尝试上面的代码,但未显示预期结果

CREATE PROCEDURE SelectEmployee @name varchar(50)
AS
Select * from Employees WHERE name = @name
GO;

表结构

[Department]
(
    [departmentID] INT IDENTITY (1, 1) NOT NULL PRIMARY KEY,
    [name] VARCHAR(50) NOT NULL,
    [costCentreID] INT FOREIGN KEY REFERENCES CostCentre(costCentreID)
);



[Employees]
(
    [employeeNo] INT IDENTITY (1, 1) NOT NULL PRIMARY KEY,
    [lastName] VARCHAR(50) NOT NULL,
    [firstName] VARCHAR(50) NOT NULL,
    [gender] CHAR NOT NULL,
    [IDNumber] VARCHAR(20) NOT NULL,
    [salaryLevelID] INT,
    [departmentID] INT FOREIGN KEY REFERENCES Department(departmentID)
);

2 个答案:

答案 0 :(得分:2)

如Larnu所建议的那样,您需要将表join显式地在一起,以从两个满足join条件的地方得到结果。

对于您来说,这看起来像这样:

select e.employeeNo,
       e.lastName,
       e.firstName,
       e.gender,
       e.IDNumber,
       e.salaryLevelID,
       e.departmentID,
       d.name as departmentName
from Department as d
    join Employees as e
        on d.departmentID = e.departmentID
where d.name = @name

但是,在没有提供@name值的情况下返回所有雇员的附加逻辑将要求您将参数设为可选,并且存储过程中的脚本能够处理提供值和提供值的地方不是。

答案 1 :(得分:2)

如果您想在没有给出姓名的情况下带回所有员工,则可以修改过程以接受可选参数。

您提供的查询在ELSE语句中包含不必要的JOIN,因为您想返回所有员工。因此,请考虑以下几点:

CREATE PROCEDURE SelectEmployee @name varchar(50) = ''
AS

IF (@name <> '')
    BEGIN   
        select e.employeeNo,
               e.lastName,
               e.firstName,
               e.gender,
               e.IDNumber,
               e.salaryLevelID,
               e.departmentID,
               d.name as departmentName
        from Department as d
            join Employees as e
                on d.departmentID = e.departmentID
        where d.name = @name
    END
ELSE
    BEGIN
        select e.employeeNo,
               e.lastName,
               e.firstName,
               e.gender,
               e.IDNumber,
               e.salaryLevelID,
               e.departmentID,
               'ALL' as departmentName
        from  Employees e

    END

因此您可以像这样运行它以获取所有薪资雇员:

EXEC SelectEmployee 'Payroll' 

或者像这样才能吸引所有员工

EXEC SelectEmployee