【问题标题】:show records that have only one matchin row in another table显示在另一个表中只有一个匹配行的记录
【发布时间】:2020-07-08 07:01:03
【问题描述】:

我需要编写一个可能非常简单但我很陌生的 sql 代码。 我需要从另一个表中找到一个表中具有匹配 id(但不超过一个)的所有记录。例如。一张表包含员工的记录,第二张表包含员工的电话号码。我需要找到只有一部电话没有的所有员工

【问题讨论】:

  • edit您的问题(通过点击下面的edit链接)并添加一些示例数据和基于该数据的预期输出为formatted text .请参阅here,了解有关如何创建漂亮的文本表格的一些提示。 (edit 您的问题 - 在 cmets 中邮政编码或其他信息)
  • this 回答你的问题了吗?
  • @Bill:有趣,但不同的问题。

标签: postgresql


【解决方案1】:

样本数据会很好。如果没有:

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】:

    您需要 2 个表中的 joingroup 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;
    

    【讨论】:

      【解决方案3】:

      如果表格中每个员工的电话号码可能超过几个数字(称为tel),那么避免GROUP BYHAVING 会更便宜,因为它们必须处理所有行。使用 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 代替是一种普遍的反模式。

      相关:

      【讨论】:

        猜你喜欢
        • 2013-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多