【发布时间】:2020-07-08 07:01:03
【问题描述】:
我需要编写一个可能非常简单但我很陌生的 sql 代码。 我需要从另一个表中找到一个表中具有匹配 id(但不超过一个)的所有记录。例如。一张表包含员工的记录,第二张表包含员工的电话号码。我需要找到只有一部电话没有的所有员工
【问题讨论】:
标签: postgresql
我需要编写一个可能非常简单但我很陌生的 sql 代码。 我需要从另一个表中找到一个表中具有匹配 id(但不超过一个)的所有记录。例如。一张表包含员工的记录,第二张表包含员工的电话号码。我需要找到只有一部电话没有的所有员工
【问题讨论】:
标签: postgresql
样本数据会很好。如果没有:
SELECT
employees.employee_id
FROM
employees
LEFT JOIN
(SELECT distinct on(employee_id) employee_id FROM emp_phone) AS phone
ON
employees.employee_id = phone.employee_id
WHERE
phone.employee_id IS NOT NULL;
【讨论】:
您需要 2 个表中的 join、group by 员工和 having 子句中的条件:
SELECT e.employee_id, e.name
FROM employees e INNER JOIN numbers n
ON e.employee_id = n.employee_id
GROUP BY e.employee_id, e.name
HAVING COUNT(*) = 1;
【讨论】:
如果表格中每个员工的电话号码可能超过几个数字(称为tel),那么避免GROUP BY 和HAVING 会更便宜,因为它们必须处理所有行。使用 NOT EXISTS 的自反加入查找具有“唯一”编号的员工。
虽然您只需要employee_id 及其唯一的电话号码,但您甚至根本不需要涉及employee 表:
SELECT *
FROM tel t
WHERE NOT EXISTS (
SELECT FROM tel
WHERE employee_id = t.employee_id
AND tel_number <> t.tel_number -- or use PK column
);
如果您需要员工表中的其他列:
SELECT * -- or any columns you need
FROM (
SELECT employee_id AS id, tel_number -- or any columns you need
FROM tel t
WHERE NOT EXISTS (
SELECT FROM tel
WHERE employee_id = t.employee_id
AND tel_number <> t.tel_number -- or use PK column
)
) t
JOIN employee e USING (id);
子查询中的列别名 (employee_id AS id) 只是为了方便。那么外连接条件可以是USING (id),结果中ID列只包含一次,即使是SELECT *...
更简单的智能命名约定在任何地方都使用employee_id 作为员工 ID。但使用 employee.id 代替是一种普遍的反模式。
相关:
【讨论】: