顶级查询中的子表的结果

时间:2014-02-13 16:19:53

标签: sql oracle hibernate jpa

不确定如何标题,请随时重新标注。

我有两张表有一对多的关系。

表1

|ID|NAME|...|

表2

|ID|Table1_ID|StartDate|EndDate|

我正在尝试编写一个查询,给定日期将返回以下内容

|TABLE1.ID|TABLE1.NAME|are any rows of table 2 in date|

我在表1和表2之间有一对多。我想将日期传递给查询。如果表2中的许多关系中的任何一个具有开始日期<通过日期和结束日期>传递的日期或结束日期为null然后我希望结果的第3列为true。在其他地方,我希望它是假的。

考虑示例

|ID|NAME|...|
| 1|APPLE| ...|
| 2|PEAR| ...|

表2

|ID|Table1_ID|StartDate|EndDate|
|1|1|01-01-2014|null|
|2|1|01-01-2014|01-02-2014|
|3|2|01-01-2014|01-02-2014|
  • 如果我在2014年1月1日通过,那么我希望两行ID为1和2,两者都为真(所有行都匹配)
  • 如果我在2014年1月1日通过,那么我希望两行ID为1(第一行匹配),ID 2为假(因为第三行不在此日期)

我试图在SQL中执行此操作以最终转换为JPA。如果有任何JPA功能可以做到这一点,那么这将是很好的知道。否则我会做一个原生查询

任何指针都会很棒!

由于

2 个答案:

答案 0 :(得分:0)

这可以给你你想要的东西:

select x.*, 'PASS' as checker
  from table1 x
 where exists
 (select 'x'
          from table2 y
         where y.table1_id = x.table1_id
           and y.startdate <= '01-01-2014'
           and (y.enddate >= '01-01-2014' or y.enddate is null))
union all
select x.*, 'FAIL' as checker
  from table1 x
 where not exists
 (select 'x'
          from table2 y
         where y.table1_id = x.table1_id
           and y.startdate <= '01-01-2014'
           and (y.enddate >= '01-01-2014' or y.enddate is null))

答案 1 :(得分:0)

我不知道我是否理解你的问题。 所以,请耐心等待......;)

尝试这样的事情:

select t1.id, t1.name,
       case when t2.Table1_ID is null
            then 'false'
            else 'true' end as boolean_value
from Table1 t1,
     (select distinct Table1_ID
      from Table2
      where yourdate >= StartDate
         and (yourdate <= EndDate or EndDate is null) t2
where t1.id = t2.id (+);