我有一个“员工”表
create table employee
(
e_number int,
e_name varchar(20),
salary money,
hire_date date
)
现在我只想显示同名但工资不同的员工的姓名。
我试过select e_name,count(*) from employee group by e_name having count(*)>1;
但不能将它与“相同的薪水”部分结合起来。有什么帮助吗?
我有一个“员工”表
create table employee
(
e_number int,
e_name varchar(20),
salary money,
hire_date date
)
现在我只想显示同名但工资不同的员工的姓名。
我试过select e_name,count(*) from employee group by e_name having count(*)>1;
但不能将它与“相同的薪水”部分结合起来。有什么帮助吗?
这假设您想要列出的两个人的姓名:
SELECT e1.e_name
FROM employee e1, employee e2
WHERE e1.e_name = e2.e_name
AND e1.salary <> e2.salary;
如果您只想将每个名称列出一次,您将使用 SELECT DISTINCT 而不是 SELECT。
如果您的目标是在 having 子句中表达这一点:
Select name
from employee
group by name
having
count(*) > 1
and min(salary) != max(salary)
order by name
SELECT employee1.e_name, employee1.Salary, Employee2.Salary
FROM Employee employee1
JOIN Employee employee2
on employee1.name = employee2.name
AND Employee1.Salary <> Employee2.Salary
AND Employee1.E_Number <> employee2.E_Number
基本上让每个员工,通过名称将其加入每个其他员工,其中员工编号不同(所以不要加入自己)并且薪水不同。
您可能不需要检查员工编号是否不同,因为在您的表格设计中 1 名员工只能有 1 份薪水
使用连接,但重要的是使用大于比较,而不是不等于,以避免重复:
SELECT e1.e_name as name1, e2.e_name as name2
FROM employee e1
JOIN employee e2 ON e1.e_name = e2.e_name
AND e1.salary > e2.salary;
另请注意,ON 条件包含工资比较。一个常见的误解是 join on 条件可能只包含与键相关的比较。这样做可以带来显着的性能优势,尤其是在进行进一步连接时,因为 ON 条件在行连接时执行 - 这会立即丢弃不匹配项,而 WHERE 条件作为连接的整个结果集的过滤器执行.
您只想要不同工资的计数,而不是所有记录的计数。
select e_name,count(distinct salary)
from employee
group by e_name
having count(distinct salary)>1
(如果不需要,请在选择中删除计数 - 包括在您的示例中)
首先过滤工资不加倍(不加倍),然后按e_name
计数 > 1进行分组
SELECT A.e_name
FROM employee A
WHERE A.salary NOT IN (SELECT salary FROM employee WHERE id != A.id)
GROUP BY A.e_name
HAVING COUNT(A.e_name) > 1