SQL:如何只查询一次而不是循环查询日期?

SQL:如何只查询一次而不是循环查询日期?,sql,mybatis,ibatis,Sql,Mybatis,Ibatis,我有一张这样的桌子: --------------------------------------- product_id | valid_from | valid_till | 1 | 2018-01-01 | 2018-09-01 | 2 | 2013-03-01 | 2019-07-01 | --------------------------------------- 我想检索给定日期列表中的所有有效产品,并将其放入地图中: 所以我要做的是:

我有一张这样的桌子:

---------------------------------------
product_id | valid_from  | valid_till |
1          |  2018-01-01 | 2018-09-01 |
2          |  2013-03-01 | 2019-07-01 |
---------------------------------------

我想检索给定日期列表中的所有有效产品,并将其放入地图中:

所以我要做的是:

Map<Date, List<Product>> map = new HashMap<>();
for (Date date : list_date) {
    Map<String, Object> param = new HashMap<>();
    param.put("date", date);
    List<Product> products = this.queryForList("getProductForDate", param);
    map.put(date, products);
}
我的问题是:

select product_id
from my_table
where date >= valid_from and date < valid_till

但是我想知道,是否可以只执行一次查询,而不是在代码中循环日期?在这种情况下如何处理where子句?

我知道Mybatis在SqlSession接口中有selectMap方法,但我从未使用过,您可以自己尝试。我相信可以。使用CTE可能是最简单的解决方案

可以将日期列表作为参数传递

Map Map=新的HashMap; Map param=新的HashMap; 参数putdates,列表日期; 列表结果=this.queryForListgetProductForDate,参数; 语句和结果映射可能如下所示:

日期为 从dual中选择{date,jdbcType=date}作为d 选择日期。问题中的d日期,t产品id 从日期开始 左加入我的桌子上 dates.d>=t.valid\u from和t.valid\u till>dates.d 解释CTE可能是离题的,但简单地说,with子句构建一个虚拟表排序日期,其中d列的类型为DATE。 它在dates参数中为每个日期创建一行,因此如果将三个日期作为参数传递,dates表中将有三行。 选择。。。左连接部分可能很简单

现在,结果可能包含列表中的每个日期,即使该日期没有有效的产品。 例如

[
  {
    date : 2019-01-01,
    products : [
     {id: 2, ...}
    ]
  },
  {
    date : 2019-01-03,
    products : [
      {id: 1, ...},
      {id: 2, ...}
    ]
  },
  {
    date : 2019-01-05,
    products : []
  },
  ...
]
虽然这个结果并不完全是您想要的,但它很容易转换

Map validProductsPerDate=result.stream .toMap e->Date e.getdate, e->列出e.getproducts; 这是一个可执行文件。
演示使用mapper界面,包括随机日期和连续日期的示例。

预期输出是什么?您的查询不起作用吗?您使用的数据库是什么?您好,我使用的是Oracle,我不知道Oracle中的预期输出应该是什么,但在mybatis中,它应该返回一个map@google_tech_lead列表中的日期是随机的还是类似于“一个月中的每一天”之类的?嗨,这是随机的日期