Как проверить записи не в двух таблицах на дату в другой третьей таблице с помощью DB2 sql?

#sql #db2

Вопрос:

У меня есть таблица сотрудников со списком имен сотрудников с идентификаторами, из которой они переходят в две таблицы со структурой ниже :

Таблица EMP

ID EMP_NAME
100 боб

create table EMP (ID varchar(20),EMP_NAME varchar(20));
insert into EMP values('100','BOB')

Таблица 1

ID Имя Дата
100 боб 01-10-2021
100 боб 01-11-2021

create table Table_1(ID varchar(20),NAME varchar(20), DATE date);

insert into Table_1 values('100','BOB','01-10-2021');insert into Table_1 values('100','BOB','01-11-2021');

Таблица 2

ID Имя Дата
100 боб 01-11-2021
100 боб 01-12-2021

create table Table_2(ID varchar(20),NAME varchar(20), DATE date);

insert into Table_2 values('100','BOB','01-11-2021');insert into Table_1 values('100','BOB','01-12-2021');

Дата таблицы

Месяц Дата
Сен 01-09-2021
Окт 01-10-2021
Ноя 01-11-2021
Дек 01-12-2021

create table DATE(Month varchar(20), DATE date);
insert into DATE values('Sep','01-09-2021');insert into DATE values('Sep','01-10-2021');insert into DATE values('Sep','01-11-2021'); insert into DATE values('Sep','01-12-2021'))

Я хочу обратиться к таблице Таблица 3 (Таблица дат), чтобы определить, на какую дату записи ТАБЛИЦЫ 3 не появлялись в ТАБЛИЦАХ 1 и 2 ( как и в данном случае, запись с датой = 01-09-2021 является ожидаемым результатом)

Ожидаемые результаты

ID Имя Дата
100 боб 01-09-2021

Ответ №1:

Я хочу сослаться на таблицу таблица 3 (Таблица дат), чтобы определить, на какую дату записи ТАБЛИЦЫ 3 не было в ТАБЛИЦАХ 1 и 2

Если вам просто нужны общие даты, которые не отображаются, вы можете использовать not exists или left join :

 select d.*
from dates d
where not exists (select 1 from table1 t1 where t1.date = d.date) and
      not exists (select 1 from table2 t2 where t2.date = d.date);
 

Это тот вопрос, который вы задаете. Однако желаемые результаты предполагают, что вам нужны комбинации сотрудник/дата, которые не отображаются. Если это так, то CROSS JOIN таблицы emp и dates и отфильтруйте те, которые не существуют. Один подход:

 select e.*, d.*
from emp e cross join
     dates d left join
     table1 t1
     on t1.date = d.date and t1.id = e.id left join
     table2 t2
     on t2.date = d.date and t2.id = e.id
where t1.id is null and t2.id is null;
 

Ответ №2:

Попробуйте это:

 SELECT E.ID, E.EMP_NAME, D.DATE
FROM DATE D, EMP E
WHERE 
    NOT EXISTS (SELECT 1 FROM Table_1 T WHERE T.ID = E.ID AND T.DATE = D.DATE) 
AND NOT EXISTS (SELECT 1 FROM Table_2 T WHERE T.ID = E.ID AND T.DATE = D.DATE)