编写查询以查找所有高于其经理的员工工资

Car*_*o M 4 sql-server subquery

我有两个带有一些虚拟数据的表。我需要找到所有比他们的经理赚更多的员工。我相信这个练习的重点是学习如何做子查询。

我可以隔离经理、他们的薪水和他们工作的公司,但我不知道如何继续将他们的员工薪水与 SQL 中的经理进行比较。回到我身边的错误是“当子查询没有通过 EXISTS 引入时,只能在选择列表中指定一个表达式。” 我明白,但如果我不能从子查询中至少传递经理的姓名和薪水,那么我不知道如何解决问题。

如果有人可以指出我已回答的类似帖子或一些可以提供一些见解的阅读,我将不胜感激。

我的查询获取有关经理的信息

SELECT DISTINCT w.salary, w.pname, w.cname
FROM WorksFor w
INNER JOIN Manages m
ON w.pname = m.mname
Run Code Online (Sandbox Code Playgroud)

员工/公司表

CREATE TABLE WorksFor (
employerID int identity(1,1) primary key,
pname varchar(30),
cname varchar(20),
salary int
);

INSERT INTO WorksFor(pname,cname,salary)
VALUES
('John Smith','BigStore',27500),
('Jane Doe','SmallStore',19000),
('Adam Scott','BigStore',50000),
('Bonnie Noel','SmallMfg',25000),
('Cassie Johnson','BigStore',35000),
('Donald Eckerson','SmallStore',29000),
('Erin Joel','SmallMfg',49000);

CREATE TABLE Manages (
manageID int identity(1,1) primary key,
pname varchar(30),
mname varchar(30)
);
Run Code Online (Sandbox Code Playgroud)

经理表

INSERT INTO Manages(pname,mname)
VALUES
('John Smith','Adam Scott'),
('Jane Doe','John Doe'),
('Bonnie Noel','Erin Joel'),
('Cassie Johnson','Adam Scott'),
('Donald Eckerson','John Doe');
Run Code Online (Sandbox Code Playgroud)

Han*_*non 6

举例说明@ypercube 在他对您的问题的评论中提出的所有项目,您可以重新设计您的表结构,如:

CREATE TABLE Workers 
(
    WorkerID INT NOT NULL CONSTRAINT PK_Posts PRIMARY KEY IDENTITY(1,1)
    , ManagedByWorkerID INT NULL CONSTRAINT FK_Workers_WorkerID REFERENCES Workers(WorkerID)
    , Salary NUMERIC(10,2) 
);
Run Code Online (Sandbox Code Playgroud)

为演示目的添加一些示例数据:

INSERT INTO Workers VALUES (NULL, 1000000);
INSERT INTO Workers VALUES (NULL, 50000);
INSERT INTO Workers VALUES (1, 40000);
INSERT INTO Workers VALUES (1, 1000001);
INSERT INTO Workers VALUES (3, 40002);
INSERT INTO Workers VALUES (2, 29999);
INSERT INTO Workers VALUES (2, 60000);
INSERT INTO Workers VALUES (5, 60000);
Run Code Online (Sandbox Code Playgroud)

最后,返回比老板赚更多的工人的查询:

SELECT *
FROM dbo.Workers;

SELECT W.WorkerID
    , W.Salary
    , Bosses.WorkerID AS BossID
    , Bosses.Salary AS BossSalary
FROM dbo.Workers W
    INNER JOIN dbo.Workers Bosses ON W.ManagedByWorkerID = Bosses.WorkerID
        AND Bosses.Salary < W.Salary;
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明