#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)