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

演示:

在什么条件下加入表?并且不要对日期/时间使用字符串,而是使用适当的日期/时间类型。整数/数字也是如此。我不知道“交叉应用”和“提取”。我试着习惯使用这两种东西。非常感谢。