3

我有一个“员工”表

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; 但不能将它与“相同的薪水”部分结合起来。有什么帮助吗?

4

6 回答 6

4

这假设您想要列出的两个人的姓名:

SELECT e1.e_name
FROM employee e1, employee e2
WHERE e1.e_name = e2.e_name
AND e1.salary <> e2.salary;

如果您只想将每个名称列出一次,您将使用 SELECT DISTINCT 而不是 SELECT。

于 2012-12-11T03:26:36.100 回答
2

如果您的目标是在 having 子句中表达这一点:

Select name 
 from employee
 group by name
 having 
   count(*) > 1
   and min(salary) != max(salary)
 order by name
于 2012-12-11T03:33:47.577 回答
0
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 份薪水

于 2012-12-11T03:30:23.770 回答
0

使用连接,但重要的是使用大于比较,而不是不等于,以避免重复:

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 条件作为连接的整个结果集的过滤器执行.

于 2012-12-11T03:38:06.803 回答
0

您只想要不同工资的计数,而不是所有记录的计数。

select e_name,count(distinct salary)
from employee
group by e_name
having count(distinct salary)>1

(如果不需要,请在选择中删除计数 - 包括在您的示例中)

于 2012-12-11T03:44:05.370 回答
0

首先过滤工资不加倍(不加倍),然后按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
于 2012-12-11T03:53:17.027 回答