我有桌子员工和桌子家庭。让我们说员工有名称栏和工资栏。 然后我必须计算他们的工资:3%是有家庭的员工的工资,2%是所有没有家庭的人。 你知道怎么做吗?我知道我必须使用存在,但我不知道如何计算工资。
此表员工:
employeeID int,
Name varchar(10),
PhoneNumber varchar(20),
ICNumber varchar(15),
Salary decimal(5,2),
primary key(employeeId));
这是表格族
familyId int,
name varchar(20),
family varchar(20),
address varchar(25),
phoneNumber varchar(20),
employeeID int,
primary key (employeeID),
FOREIGN KEY (employeeID) REFERENCES Employee(employeeID))
答案 0 :(得分:0)
如果子查询返回至少一行,则SQL EXISTS条件与子查询结合使用并被视为满足。它可以在SELECT,INSERT,UPDATE或DELETE语句中使用。
http://www.techonthenet.com/sql/exists.php
因此,让我们看看我们如何使用它来确定是否将特定薪水更新3%或2%。
对于有家庭的员工:
UPDATE Employee
SET Salary = 1.03 * Salary
WHERE EXISTS (
SELECT 1 FROM Family WHERE Employee.employeeId = Family.employeeId
)
我将另一个案例作为练习留给读者(hint)。
<强>更新强>
如果您只想选择新薪水
SELECT employeeId, 1.03 * Salary As NewSalary FROM Employee
WHERE EXISTS (
SELECT 1 FROM Family WHERE Employee.employeeId = Family.employeeId
)
答案 1 :(得分:0)
我假设你想选择+ 3%或+ 2%的价值而不是更新?
SELECT
employeeid,
salary,
salary * loading_factor AS loading
FROM (
SELECT
employeeid,
salary,
CASE
WHEN EXISTS SELECT 1 FROM family f WHERE f.employeeID = e.employeeID THEN 0.03
ELSE 0.02
END AS loading_factor
FROM employee e
)
你可以在没有子选择的情况下做到这一点,但我认为它会更容易阅读。如果您想要新的工资总额而不是增量,请将0.02 / 0.03更改为1.02 / 1.03。
答案 2 :(得分:0)
就个人而言,我尝试尽可能不使用exists
或not exists
条款。在您的情况下,您可以使用左外连接获得所需的结果:
select
emp.name,
emp.salary,
case when fam.employeeID is null
then 0.02
else 0.03
end * emp.salary salary_adjusted
from
employee emp left join
family fam on emp.employeeID = fam.employeeID;