PostgreSQL - условие WHERE, которое ссылается на 2 разные записи и должно быть TRUE - PullRequest
0 голосов
/ 29 октября 2018

У меня есть таблицы:

company_employees:

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 |
+-----------+--------------+

Я хочу отображать только названия компаний ( companies.name) , где работают сотрудники «Джон Смит» и «Майк Браун». Таким образом, запрос должен отображать:

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

У вас есть идеи, как это сделать? Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

вы можете попробовать, как показано ниже, если 2 разных сотрудника, работающих в той же компании, что и ниже, будут работать

SELECT
    c.name AS Company
FROM employees e
INNER JOIN company_employees ce
    ON ce.id_employee = e.id_employee
INNER JOIN companies c
    ON c.id_company = ce.id_company

GROUP BY
    c.name
    HAVING
    count(distinct e.name)=2

ДЕМО в скрипке

company
Microsoft
0 голосов
/ 29 октября 2018

Мы можем попробовать агрегировать по названию компании, а затем заявить, что:

  • В каждой группе компаний есть только два имени: «Джон Смит» и «Майк Браун»
  • Количество различных имен в каждой группе компаний - два

Оба эти условия означают, что любая компания в наборе результатов соответствует вашим критериям.

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);
...