Sql 考虑到给定的间隔,如何连接两个表
我想把两张桌子连在一起Sql 考虑到给定的间隔,如何连接两个表,sql,database,oracle,join,Sql,Database,Oracle,Join,我想把两张桌子连在一起 WITH A AS ( (SELECT 'KIM' AS NAME, '20160503' AS DATE FROM DUAL) UNION (SELECT 'LEE' AS NAME, '20160307' AS DATE FROM DUAL) UNION (SELECT 'PARK' AS NAME, '20170728' AS DATE FROM DUAL) ), B AS ( (SELECT '20160227' AS
WITH A AS (
(SELECT 'KIM' AS NAME,
'20160503' AS DATE
FROM DUAL)
UNION
(SELECT 'LEE' AS NAME,
'20160307' AS DATE
FROM DUAL)
UNION
(SELECT 'PARK' AS NAME,
'20170728' AS DATE
FROM DUAL)
),
B AS (
(SELECT '20160227' AS INTERVAL,
'1' AS NUM
FROM DUAL)
UNION
(SELECT '20160520' AS INTERVAL,
'2' AS NUM
FROM DUAL)
UNION
(SELECT '20170825' AS INTERVAL,
'3' AS NUM
FROM DUAL)
)
在这种情况下,我想在A和B中进行记录,如下所示
“KIM”“20160503”“20160227”“1”
“李”20160307“20160227”1
“公园”“20170728”“20160520”“2”
最重要的是,表A根本不会改变,但表B会根据某些情况而改变
所以,我现在不能简单地在表A中使用用例,我必须将表A与发生变化的表B连接起来
简而言之,考虑到时间间隔,我想将表A与表B连接起来
如果你给我一个适当的建议,我真的很感激
我使用的是Oracle DBMS我想你给日期列间隔命名让我们有点困惑:-这似乎是一个期间的开始日期,你想将每个名称与相关的期间连接起来,即名称日期之前的最后一个开始日期 您可以将交叉应用与获取第一行结合使用:
WITH a AS
(
SELECT 'KIM' AS name, DATE '2016-05-03' AS dt FROM DUAL
UNION ALL
SELECT 'LEE' AS name, DATE '2016-03-07' AS dt FROM DUAL
UNION ALL
SELECT 'PARK' AS name, DATE '2017-07-28' AS dt FROM DUAL
)
, b AS
(
SELECT DATE '2016-02-27' AS start_dt, 1 AS num FROM DUAL
UNION ALL
SELECT DATE '2016-05-20' AS start_dt, 2 AS num FROM DUAL
UNION ALL
SELECT DATE '2017-08-25' AS start_dt, 3 AS num FROM DUAL
)
select *
from a
cross apply
(
select *
from b
where b.start_dt <= a.dt
order by b.start_dt desc
fetch first row only
);
演示:在什么条件下加入表?并且不要对日期/时间使用字符串,而是使用适当的日期/时间类型。整数/数字也是如此。我不知道“交叉应用”和“提取”。我试着习惯使用这两种东西。非常感谢。