我试图基于两个日期比较SQL表中的两列。 设置该表是为了使表A中的每个人都具有另一个表B的外键,每个人可以在表B中具有多个条目。表B中的每个条目都包含开始日期和结束日期,我正尝试抓住每个表B中有重叠的人员,因此其中一个条目的开始日期早于任何其他条目的结束日期。

因此,表A中的John Doe在表B中有两个条目,其中条目1的开始日期是2015年4月5日,结束日期是2016年4月6日,第二个条目是2016年1月10日并且结束于2017年1月10日,所以我想包括我的结果集中的这个人。

但是表A中的Jane Doe作为表B中的两个条目

Entry 1: SD April 10th 2014 End April 10th 2015
Entry 2: SD May 11th 2015 End May 11th 2016

因此,我不想在结果集中包含Jane Doe。

我想我需要在select语句的where部分中使用两个嵌套的for循环,这取决于我是否要包含此人,来回翻转变量。

遵循以下原则

Select * from A 
where 
(reset variable
for b in
(select * from b.id = A.b_id); loop
    for btwo in 
    (select * from b.id = A.b_id); loop
    // set variable based on start / end date
    // if I want to include set var = 1 else 0
    end loop;
end loop;)
variable = 1;

===============>>#1 票数:1

您已为两个数据库系统标记了该问题-我的回答与Oracle有关。

此处无需使用循环,因为您可以使用SQL分析函数LAG来处理此类问题。

以下内容将提供您想要的结果:

SELECT DISTINCT T.NAME
  FROM (SELECT A.NAME,
               B.START_DATE,
               B.END_DATE,
               LAG(B.START_DATE) OVER (PARTITION BY A.NAME ORDER BY B.NAME, B.START_DATE) AS PREV_START,
               LAG(B.END_DATE) OVER (PARTITION BY A.NAME ORDER BY B.NAME, B.START_DATE) AS PREV_END
          FROM A
          INNER JOIN B
            ON B.NAME = A.NAME
          ORDER BY A.NAME) T
  WHERE (T.START_DATE BETWEEN T.PREV_START AND T.PREV_END) OR
        (T.END_DATE BETWEEN T.PREV_START AND T.PREV_END) OR
        (T.PREV_START BETWEEN T.START_DATE AND T.END_DATE) OR
        (T.PREV_END BETWEEN T.START_DATE AND T.END_DATE);

SQLFiddle在这里

===============>>#2 票数:0 已采纳

这是我的建议。 要获得重叠,可以使用:

select b.*
from tableb b
where exists (select 1
              from tableb b2
              where b.aid = b2.aid and
                    b.startdate < b2.enddate and b.enddate > b.startdate
             );

逻辑很简单。 如果第一个时间间隔在第二个时间间隔之前开始,而第一个时间间隔在第二个时间间隔之后开始,则两个时间间隔重叠。

要获取表的值:

with overlaps as (
      select b.*
      from tableb b
      where exists (select 1
                    from tableb b2
                    where b.aid = b2.aid and
                          b.startdate < b2.enddate and b.enddate > b.startdate
                   )
    )
select a.*
from tablea a
where a.aid in (select o.aid from overlaps o);

注意:根据您定义“重叠”的方式,您可能需要<=>=进行比较。

  ask by Bitter translate from so

未解决问题?本站智能推荐:

3回复

Oracle PL / SQL函数-在同一循环中更新和选择

我想知道如何提高我的功能效率。 另外,我认为update语句未处理,因为它与同一表上的select语句在同一循环迭代中发生。 我想知道我应该如何编写此函数以使其高效并真正起作用。 我在完成订单时在触发器中使用此功能。 提前致谢。
1回复

使用for循环在Oracle Pl / Sql中移动列

例如,我想将我的2列在例如KW_01(下拉列表)和KW_03(下拉列表)之间移动到KW_04(下拉列表)和KW_06(下拉列表)之间。 我在表格中有53列。 我编写了代码(见下文),但遗憾的是它无法正常工作。 当我开始编码时他会这样做。 出乎意料的结果: 我的DB
2回复

比较oracle sql中单个表的两个字段

我有一个这样的表,我需要编写一个sql查询来比较和验证记录是否正确。 例如:dhoni在column2中具有no1,就像每个玩家都有自己的no一样,我需要编写代码来验证没有一个玩家为一个以上的玩家分配了相同的no。 并需要检查天气,玩家只分配了他的号码。 注意:编写一个查询来验证表数
1回复

Oracle SQL:比较2列中的所有值并交换它们

我有一个名为myC的表的Oracle数据库。 在此表中,我有几行,其中两行称为myCheight, myCwidth 。 我需要读取这些值并进行比较,就像在IF myCheight > myCwidth DO switch the values.一样。请IF myCheight &
3回复

在Oracle SQL中循环

我想将ID_last列添加到下面左侧的表中。 示例表由6行和8行的两个序列组成。 我需要处理许多序列,每个序列的行数/每个序列的循环数未知/无限。 当ID不在ID_new中时,序列开始;当ID_new不在ID中时,序列停止。 我想知道序列中所有ID的最后一个ID_new(如右表所示)。
1回复

在Oracle DB中比较两行并显示列不匹配

表格栏:编号,名称,年龄 第一排: 这将返回 第二行: 这将返回 现在,我想比较两行: 它应该返回具有差异的列。 名称不匹配年龄不匹配 我正在使用12c在oracle中有内置功能,它将解决此问题。 或通过其他任何方式可以实现相同的
3回复

比较两个不同的oracle表中的2个逗号分隔的列

我想比较表1的列n和表2的列b。 两者都有逗号分隔的值。 就我而言,如果列B中的所有值都存在于列A中,则我必须返回TRUE 否则为假。 请指教。 例如: 1.列A具有a,b,c,def列B具有a,c,b,其应返回TRUE 2.第1列具有vvv,ccc,rr第2列具有ccc
1回复

在PL / SQL循环中使用新的提交策略存档3200万个Oracle表行

我被要求修改以下过程以处理3200万行,因为当前作业正在运行缓慢。 他们告诉我在批量循环中提交每10,000行,但是通过提交每10,000个我然后丢失表上的独占锁。 我正在寻找一种有效的方法来处理这些记录与表上的独占锁。 作业将名为act_plus_triggers的生产表中的旧记录归
2回复

Oracle PL SQL:比较两个存储的proc返回的ref游标结果

给了我一个存储过程,该过程生成一个打开的游标,该游标作为输出传递到报告工具。 我重新编写了此存储过程以提高性能。 我想做的是显示给定一组输入参数的两个结果集是相同的。 等同于: 每个游标从很大的表子集中返回几十列。 每行都有一个ID值,以及该ID的其他列值的长列表。 我想检
2回复

如何将两个Oracle SQL对象类型与通用基本超类进行比较

例: Figure_t基类(超级类) 图_t下的sphere_t Figure_t下的pyramid_t 两者都有音量。 如何使用地图或订单功能进行对象比较? 我正在做的是使用超类中的map成员函数进行体积比较。 我尝试过/不重写子类中的地图功