Убедитесь, что идентификатор в столбце не имеет значения частиц в другом столбце в тех же таблицах - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть таблица зарплат с salarySumId, salaryYear, и я хочу сделать выборочный запрос, чтобы найти salarySumIds, у которых вообще нет 2020-01-01.

мой запрос выглядит следующим образом

select distinct  salarySumId, salaryYear 
from Salary 

этот qyery возвращает что-то вроде этого

salarySumId     salaryYear 
-----------     ------------
4593086         2019-01-01 
4593093         2018-01-01 
4593093         2019-01-01 
4593093         2020-01-01 
4593094         2019-01-01 
4593095         2018-01-01 
4593095         2019-01-01 
4593095         2020-01-01 
4593096         2017-01-01 
4593096         2018-01-01 
4593096         2019-01-01 
4593096         2020-01-01 

Когда я пишу запрос с фильтром 2020-01-01 следующим образом:

select distinct  salarySumId, salaryYear 
from Salary 
where Salary.InsuranceYear < '2020-01-01'

alarySumId      salaryYear 
-----------     ------------
4593086         2019-01-01 
4593093         2018-01-01 
4593093         2019-01-01 
4593094         2019-01-01 
4593095         2018-01-01 
4593095         2019-01-01 
4593096         2017-01-01 
4593096         2018-01-01 

На самом деле я просто хочу, чтобы запрос возвращал (4593086, 4593094), так как они вообще не имеют значения salaryYear для 2020-01-01.

Как повторно напишите запрос для этого?

Ответы [ 2 ]

3 голосов
/ 07 февраля 2020

Do GROUP BY. Используйте выражение case в предложении HAVING для подсчета количества строк 2020-01-01.

select salarySumId
from Salary
group by salarySumId
having sum(case when salaryYear = '2020-01-01' then 1 else 0 end) = 0
2 голосов
/ 07 февраля 2020

Вы можете использовать not exists:

select s.*
from Salary s
where not exists (select 1 
                  from Salary s1 
                  where s1.salarySumId = s.salarySumId and 
                        s1.salaryYear = '2020-01-01'
                );
...