【问题标题】:How can I join two tables considering given intervals考虑到给定的间隔,我如何加入两个表
【发布时间】:2021-06-01 13:28:09
【问题描述】:

我正在尝试加入两个表

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'

'LEE''20160307''20160227'1'

'PARK' '20170728' '20160520' '2'

最重要的是,表 A 根本没有变化,但表 B 会根据某些情况而变化。

所以,我现在不能简单地在表 A 中使用 CASE,我必须将表 A 与发生变化的表 B 连接起来。

简而言之,我想考虑间隔将表 A 与表 B 连接起来。

如果你给我一个正确的建议,我真的很感激。

(我正在使用 Oracle DBMS)

【问题讨论】:

  • 在什么条件下加入表?并且不要使用字符串作为日期/时间,而是使用适当的日期/时间类型。整数/数字也是如此。

标签: sql database oracle join


【解决方案1】:

我想你把你的日期列命名为INTERVAL 让我们有点困惑 :-) 看来这应该是一个时期的开始日期,你想将每个名称与相关时期加入,即最后一个开始名称日期之前的日期。

您可以将CROSS APPLYFETCH FIRST ROW 结合使用:

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

演示:https://dbfiddle.uk/?rdbms=oracle_18&fiddle=db7f96b6ef82bfe985a9f894c2e30b82

【讨论】:

  • 我不知道“交叉应用”和“获取”。我正在尝试习惯使用这两个东西。谢谢
猜你喜欢
  • 1970-01-01
  • 2011-12-05
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
相关资源
最近更新 更多