ВНУТРЕННЕЕ СОЕДИНЕНИЕ объединяет 2 колонки - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть обычная таблица с информацией о сотруднике: ID int NAME varchar

Кроме того, у меня есть таблица с покупками. Идентификатор сотрудника приведен здесь снова в колонке продавца или подрядчика. Вполне возможно, что сотрудник не сделал никаких продаж. Также возможно, что ни подрядчик, ни продавец не участвуют.

EMPLOYEES
ID  NAME
1   Bill
2   Cliff
3   Mary
4   Jon

PURCHASES
ID  SELLER  CONTRACTOR
1   1       2
2   1     
3   2       1
4   2       3

Я хочу получить список с идентификатором и именем сотрудника, а также информацию, если этот сотрудник указан в столбцах продавца и / или подрядчика. Таким образом, в основном, если этот сотрудник совершил какие-либо продажи.

ID  NAME    SALES
1   Bill    1
2   Cliff   1
3   Mary    1
4   Jon     0

Я получаю двойные линии, когда сотрудники перечислены в нескольких продажах. Я пробовал многочисленные заявления LEFT JOIN.

Ответы [ 2 ]

1 голос
/ 10 ноября 2019

Вы можете сделать это с помощью EXISTS:

select e.*,
  exists (select 1 from purchases where e.id in (seller, contractor)) sales
from employees e 

См. Демоверсию . Или с левым соединением и агрегацией:

select e.id, e.name, max(p.id) is not null sales
from employees e left join purchases p
on e.id in (p.seller, p.contractor)
group by e.id, e.name

См. demo . Результаты:

| ID  | NAME  | sales |
| --- | ----- | ----- |
| 1   | Bill  | 1     |
| 2   | Cliff | 1     |
| 3   | Mary  | 1     |
| 4   | Jon   | 0     |
0 голосов
/ 10 ноября 2019

Вы можете использовать LEFT JOIN и COUNT на основе столбца из "внешней таблицы":

SELECT e.ID, e.name, COUNT(p1.seller) AS cnt_seller, COUNT(p2.contractor) AS cnt_contractor
FROM Employees e
LEFT JOIN Purchases p1
  ON e.ID = p1.seller
LEFT JOIN Purchases p2
  ON e.ID = p2.contractor
GROUP BY e.ID, e.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...