SELECT Для получения результатов из двух таблиц, где значение встречается только один раз в столбце таблицы - PullRequest
0 голосов
/ 11 ноября 2019

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

У меня есть две таблицы компаний иконтакты. Контакт может быть связан с 0 или 1 компанией, у компании может быть 1 или более контактов, и МОЖЕТ иметь один из них в качестве «основного контакта»

компаний (ccyID, ccyname, primconID)

________________________________________________
|  ccyID      |  ccyname      |  PrimconID    |
------------------------------------------------
|  aaaaaaa    |  Company A    |    NULL       |
|  bbbbbbb    |  Company B    |    NULL       |
|  ccccccc    |  Company C    |   vvvvvvv     |
________________________________________________

контакты (conID, Firstname, фамилия, ccyID)

__________________________________________________
|  conID    | first     | last      | companyID |
--------------------------------------------------
|  zzzzzzz  |  Stand    |   Alone   |   NULL    |
|  yyyyyyy  |  Only     |   Contact |  aaaaaaa  |
|  xxxxxxx  |  CompanyB |   First   |  bbbbbbb  |
|  wwwwwww  |  CompanyB |   Second  |  bbbbbbb  |
|  vvvvvvv  |  CompanyC |   Only    |  ccccccc  |
_________________________________________________

Мне нужен SELECT, который будет возвращать companyID и contactID, когда у компании ровно один контакт, И не будет установлен PrimconID, т.е. для вышеуказанных данных, которые я хочу вернуть

conID   ccyID
----------------
yyyyyyy aaaaaaa

(Возможная идея состоит в том, что я собираюсь обновить таблицы, чтобы сделать основной контакт для компаний основным контактом)

Ответы [ 3 ]

0 голосов
/ 11 ноября 2019

Группируйте контакты по компаниям, чтобы сохранить только те из них, у которых 1, и убедитесь, что они входят в группу компаний без основного контакта:

select companyid, max(conid)
from contacts
group by companyid
having count(*) = 1
and companyid in (select ccyid from companies where primconid is null)
order by companyid;
0 голосов
/ 11 ноября 2019

Я бы использовал join и group by:

select c.ccyid, max(co.conid)
from companies c join
     contacts co
     on co.companyid = c.ccyid
where c.PrimconID is null
group by c.ccyid
having min(co.conID) = max(co.conID);

В качестве update заявления вы можете сделать:

update c
    set PrimconID = co.conid
    from companies c join
         (select co.companyid, max(co.conid) as conid
          from contacts co
          group by companyid
          having min(co.conid) = max(co.conid)
         ) co
         on co.companyid = c.ccyid
    where c.PrimconID is null ;
0 голосов
/ 11 ноября 2019

Используйте CTE, чтобы сначала идентифицировать все контакты, имеющие только одну компанию, а затем присоединитесь к таблице компании:

WITH cte AS (
    SELECT ccyID, MAX(conID) AS conID
    FROM contacts
    GROUP BY ccyID
    HAVING COUNT(*) = 1
)

SELECT
    t.conID,
    c.ccyID
FROM companies c
INNER JOIN cte t
    ON c.ccyID = t.ccyID
WHERE
    c.PrimconID IS NULL;

См. Демонстрацию ниже, чтобы увидеть, как работает запрос.

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...