如果满足某些特定条件,如何将表形式的数据插入到另一个表中

问题描述 投票:0回答:1

逻辑:如果今天是星期一(参考“时间”表),则应将S中存在的数据插入M(以及sendd_day列,该列将具有今天的日期)。

如果今天不是星期一,则应在M表中检查与当前星期相对应的日期(唯一的week_id)。如果这些日期中的任何一个在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
sql postgresql sql-insert
1个回答
0
投票

我将在两个单独的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'));
© www.soinside.com 2019 - 2024. All rights reserved.