首页 > 解决方案 > PostgreSQL - WHERE 条件指的是 2 个不同的记录,应该是 TRUE

问题描述

我有桌子:

公司员工:

id_employee
id_company

雇员:

id_employee
name

公司:

id_company
name

如果我执行诸如查询:

SELECT companies.name AS Company, employees.name AS Employee FROM employees
INNER JOIN company_employees ON company_employees.id_employee = employees.id_employee
INNER JOIN companies ON companies.id_company = company_employees.id_company

它显示:

+-----------+--------------+
|  Company  |   Employee   |
+-----------+--------------+
| Microsoft | John Smith   |
| Microsoft | Mike Brown   |
| IBM       | Chris Miller |
+-----------+--------------+

我只想显示公司名称(company.name),其中工作员工为“John Smith”和“Mike Brown”。所以查询应该显示:

+-----------+
|   name    |
+-----------+
| Microsoft |
+-----------+

你知道怎么做吗?谢谢!

标签: sqlpostgresqlrelational-division

解决方案


我们可以尝试按公司名称聚合,然后断言:

  • 每个公司集团中仅有的两个名字是“John Smith”和“Mike Brown”
  • 每个公司组中不同名称的数量为两个

这两个条件都意味着结果集中的任何公司都符合您的标准。

SELECT
    c.name AS Company
FROM employees e
INNER JOIN company_employees ce
    ON ce.id_employee = ee.id_employee
INNER JOIN companies c
    ON c.id_company = ce.id_company
WHERE
    e.name IN ('John Smith', 'Mike Brown')
GROUP BY
    c.name
HAVING
    MIN(e.name) <> MAX(e.name);

推荐阅读