我有一张带有
的'员工'表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;
但不能将它与“同一薪水”部分结合起来。有什么帮助吗?
答案 0 :(得分: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。
答案 1 :(得分:2)
如果您的目标是在having子句中表达:
Select name
from employee
group by name
having
count(*) > 1
and min(salary) != max(salary)
order by name
答案 2 :(得分: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个工资
答案 3 :(得分: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条件包含工资比较。一种常见的误解是条件的连接可能只包含与密钥相关的比较。这样做可以带来显着的性能优势,尤其是在进一步连接时,因为ON条件在行连接时执行 - 这会立即丢弃不匹配,而WHERE条件作为连接的整个结果集执行过滤
答案 4 :(得分:0)
您只需要计算不同的工资,而不是所有记录的数量。
select e_name,count(distinct salary)
from employee
group by e_name
having count(distinct salary)>1
(如果不需要,请将选择中的计数删除 - 包括在您的示例中)
答案 5 :(得分:0)
首先过滤薪水不是双倍(不在),然后按e_name
进行分组计数&gt; 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