Как вставить данные в форме таблицы в другую таблицу при соблюдении определенных условий c - PullRequest
0 голосов
/ 25 марта 2020

Logi c: Если сегодня понедельник (справочная таблица «времени»), данные, представленные в S, должны быть вставлены в M (вместе со столбцом sent_day, в котором будет указана сегодняшняя дата).

Если сегодня не понедельник, даты, соответствующие текущей неделе (уникальный week_id), должны быть проверены в таблице M. Если любая из этих дат доступна в M, то S не следует вставлять в M. Если эти даты не доступны в M, то S следует вставлять в M

time 
+------------+------------+----------------+
|   cal_dt   |    cal_day |        week_id |
+------------+------------+----------------+
| 2020-03-23 |  Monday    |            123 |
| 2020-03-24 |    Tuesday |            123 |
| 2020-03-25 | Wednesday  |            123 |
| 2020-03-26 | Thursday   |            123 |
| 2020-03-27 | Friday     |            123 |
| 2020-03-30 | Monday     |            124 |
| 2020-03-31 | Tueday     |            124 |
+------------+------------+----------------+

M

+------------+----------+-------+
|  sent_day  |   item   | price |
+------------+----------+-------+
| 2020-03-11 | pen      |    10 |
| 2020-03-11 | book     |    50 |
| 2020-03-13 | Eraser   |     5 |
| 2020-03-13 | sharpner |     5 |
+------------+----------+-------+

S

+----------+-------+
|   item   | price |
+----------+-------+
| pen      |    25 |
| book     |    20 |
| Eraser   |    10 |
| sharpner |     3 |
+----------+-------+
Insert INTO M  
SELECT 
CASE WHEN(SELECT cal_day FROM time WHERE cal_dt = current_date) = 'Monday' THEN  s.*
     ELSE  
     (CASE WHEN(SELECT cal_dt FROM time WHERE wk_id =(SELECT wk_id FROM time WHERE cal_dt = current_date ) NOT IN (SELECT DISTINCT sent_day FROM M) THEN 1 ELSE 0 END)  
     THEN  s.* ELSE END
     FROM s

1 Ответ

0 голосов
/ 25 марта 2020

Я бы сделал это в двух отдельных операторах INSERT:

Первое условие («если сегодня понедельник») довольно простое:

insert into m (sent_day, item, price)
select current_date, item, price
from s
where exists (select *
              from "time"
              where cal_dt = current_date 
                and cal_day = 'Monday');

Я нахожу сохранение даты и день недели немного запутанный, поскольку день недели можно легко извлечь из дня. Для теста «если сегодня понедельник» вообще не нужно обращаться к таблице «времени» вообще:

insert into m (sent_day, item, price)
select current_date, item, price
from s
where extract(dow from current_date) = 1;

Вторая часть немного сложнее, но если я правильно понимаю, она должна быть примерно таким:

insert into m (sent_day, item, price)
select current_date, item, price
from s
where not exists (select *
                  from m 
                  where m.sent_day in (select cal_dt 
                                       from "time" t
                                       where cal_dt = current_date 
                                         and cal_day <> 'Monday'));

Если вы просто хотите один оператор INSERT, вы можете просто сделать UNION ALL между двумя выборами:

insert into m (sent_day, item, price)
select current_date, item, price
from s
where extract(dow from current_date) = 1
union all
select current_date, item, price
from s
where not exists (select *
                  from m 
                  where m.sent_day in (select cal_dt 
                                       from "time" t
                                       where cal_dt = current_date 
                                         and cal_day <> 'Monday'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...