Как использовать счет на основе 2 таблиц - PullRequest
0 голосов
/ 30 марта 2019

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

Пока что я сделал выше. Проблема в том, что задания без приложений вообще не отображаются, в то время как они должны отображаться только с счетчиком 0. Это, вероятно, потому, что в задании без заявителей не будет указан job_id в таблице приложений.

select count(a.job_id) "no. of applicants",
       p.job_id,  
       p.status,
       p.JOB_TYPE,
       p.EMPLOYER_ID,
from application a 
join job p 
on a.job_id=p.job_id 
where p.status='OPEN' 
group by p.job_id, 
       p.status,
       p.JOB_TYPE,
       p.EMPLOYER_ID;

Ответы [ 4 ]

0 голосов
/ 30 марта 2019

Требуется left join, поэтому вы сохраняете все задания, соответствующие условиям where:

select j.job_id, j.status, j.JOB_TYPE, j.EMPLOYER_ID,
       count(a.job_id) as num_applicants
from job j left join
     application a 
     on a.job_id = j.job_id 
where j.status = 'OPEN' 
group by j.job_id, j.status, j.JOB_TYPE, j.EMPLOYER_ID;

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

select j.*
       (select count(*)
        from application a
        where a.job_id = j.job_id
       ) as num_applications
from job j
where j.status = 'OPEN'
0 голосов
/ 30 марта 2019

Это будет НАРУЖНОЕ СОЕДИНЕНИЕ , я полагаю.Я упростил ваши таблицы (не хотелось печатать так много, поскольку вы не предоставили контрольный пример).

SQL> with
  2  application (job_id) as
  3    (select 1 from dual union all
  4     select 2 from dual
  5    ),
  6  job (job_id, status) as
  7    (select 1, 'OPEN'   from dual union all
  8     select 2, 'CLOSED' from dual union all
  9     select 3, 'OPEN'   from dual           --> no application for this job
 10    )
 11  select count(a.job_id) no_of_applicants,
 12    p.job_id,
 13    p.status
 14  from job p left join application a on p.job_id = a.job_id   --> LEFT (OUTER) JOIN
 15  group by p.job_id, p.status;

NO_OF_APPLICANTS     JOB_ID STATUS
---------------- ---------- ------
               1          2 CLOSED
               0          3 OPEN          --> job with no applications
               1          1 OPEN

SQL>
0 голосов
/ 30 марта 2019

это может помочь:

select isnull(count(a.job_id),0) "no. of applicants",
   p.job_id,  
   p.status,
   p.JOB_TYPE,
   p.EMPLOYER_ID,
from application a 
right join job p 
on a.job_id=p.job_id 
where p.status='OPEN' 
group by p.job_id, 
   p.status,
   p.JOB_TYPE,
   p.EMPLOYER_ID;
0 голосов
/ 30 марта 2019

Вам нужно переключать таблицы - выберите из «задания» и присоединитесь к «приложению», вот так:

select count(a.job_id) "no. of applicants",
       p.job_id,  
       p.status,
       p.JOB_TYPE,
       p.EMPLOYER_ID,
from job a 
join application p 
on a.job_id=p.job_id 
where p.status='OPEN' 
group by p.job_id, 
       p.status,
       p.JOB_TYPE,
       p.EMPLOYER_ID;

Другим решением является использование подзапроса для вычисления no. заявителей, но так как вы хотите просто status = 'OPEN', который находится в таблице "application", вам все равно придется присоединиться к нему.

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