oracle 需要将一个表的数据与另一个表的数据匹配

qncylg1j  于 2023-05-16  发布在  Oracle
关注(0)|答案(2)|浏览(229)

需要将一个表的数据与另一个表的数据匹配。表一只有一行,表二有许多行,按日历。
表格详情:-
第一张table:

A           B            C          D         E               G     

600       MT_000        6765    29-04-23    30-04-23    WEEK
          MT            6758    01-05-23    31-05-23    MONTH
601       MT_0001       6771    01-06-23    30-06-23    WEEK

第二张table:

A       B            C         D                    
601     MT          6758    07-05-23            
601     MT          6758    14-05-23                   
601     MT          6758    21-05-23                   
601     MT          6758    28-05-23               
601     MT          6758    28-05-23                
601     MT          6758    04-06-23

想要这样的数据:-

A    B        C       D          E 
601  MT    6758    07-05-23   MONTH 
601  MT    6758    14-05-23   MONTH 
601  MT    6758    21-05-23   MONTH
601  MT    6758    28-05-23   MONTH
601  MT    6758    28-05-23   MONTH
601  MT    6758    04-06-23   WEEK

对列A的依赖性应该在那里,值也可以为null。
我尝试连接两个表,但数据不正确。给定18行,因为每行都是相互比较的。
请帮助我解决这个问题。为了更清楚,你可以问Q。

mbjcgjjk

mbjcgjjk1#

JOIN日期范围上的两个表(可能还有b列的开始):

SELECT t2.*, t1.g
FROM   table2 t2
       INNER JOIN table1 t1
       ON (t1.b LIKE t2.b || '%' AND t2.d BETWEEN t1.d AND t1.e)
ORDER BY t2.b, t2.d

其中,对于样本数据:

CREATE TABLE table1 (A, B, C, D, E, G) AS
SELECT 600,  'MT_000',  6765, DATE '2023-04-29', DATE '2023-04-30', 'WEEK'  FROM DUAL UNION ALL
SELECT NULL, 'MT',      6758, DATE '2023-05-01', DATE '2023-05-31', 'MONTH' FROM DUAL UNION ALL
SELECT 601,  'MT_0001', 6771, DATE '2023-06-01', DATE '2023-06-30', 'WEEK'  FROM DUAL;

CREATE TABLE table2 (A, B, C, D) AS
SELECT 601, 'MT', 6758, DATE '2023-05-07' FROM DUAL UNION ALL
SELECT 601, 'MT', 6758, DATE '2023-05-14' FROM DUAL UNION ALL
SELECT 601, 'MT', 6758, DATE '2023-05-21' FROM DUAL UNION ALL
SELECT 601, 'MT', 6758, DATE '2023-05-28' FROM DUAL UNION ALL
SELECT 601, 'MT', 6758, DATE '2023-05-28' FROM DUAL UNION ALL
SELECT 601, 'MT', 6758, DATE '2023-06-04' FROM DUAL;

输出:
| 一个|B| C型|D级|G|
| --------------|--------------|--------------|--------------|--------------|
| 六零一|MT|六七五八|2019 -05- 17 00:00:00|月|
| 六零一|MT|六七五八|2023-05-14 00:00:00|月|
| 六零一|MT|六七五八|2019 -05-21 00:00:00|月|
| 六零一|MT|六七五八|2019 -05-28 00:00:00|月|
| 六零一|MT|六七五八|2019 -05-28 00:00:00|月|
| 六零一|MT|六七五八|2019 -06- 24 00:00:00|每周|
fiddle

wljmcqd8

wljmcqd82#

看起来您正在查找 table2 中的行是WEEK还是MONTH。如果这就是你想要的,使用inner join,如下所示:

SELECT t2.*, t1.G
from table2 t2
inner join table1 t1 on t2.D between t1.D and t1.E
order by t2.A, t1.D

结果:

A   B   C       D           G
601 MT  6758    07-MAY-23   MONTH
601 MT  6758    14-MAY-23   MONTH
601 MT  6758    21-MAY-23   MONTH
601 MT  6758    28-MAY-23   MONTH
601 MT  6758    28-MAY-23   MONTH
601 MT  6758    04-JUN-23   WEEK

Demo here

相关问题