sql连接到和从日期-如果找不到匹配项,则返回最近的

jtoj6r0c  于 2021-08-09  发布在  Java
关注(0)|答案(3)|浏览(331)

我有两张table需要合并。我有:

LEFT JOIN AutoBAF on (GETDATE() BETWEEN AutoBAF.FromDate and AutoBAF.ToDate)

我得到了预期的结果。现在,如果在两个日期(autobaf.fromdate和autobaf.todate)之间找不到匹配的记录,我想加入最新的匹配记录。
谁能给我指出正确的方向吗。
我使用的是托管在azure中的mssql数据库。
小例子:
我正在努力实现的一个小例子:
餐桌产品:

Product | Description

A       | Product A

表中价格

Product | FromDate | ToDate     | Price

A       | 01-01-20 | 31-01-20   | 100
A       | 01-02-20 | 28-02-20   | 110

我需要一个根据getdate()返回的日期返回价格的查询。
如果我运行查询15-01-20,我应该得到:

Product | Description   | Price
A       | Product A     | 100

如果我运行查询15-02-20,我应该得到:

Product | Description   | Price
A       | Product A     | 110

最后,如果我运行查询15-03-20,我将在价格表中没有价格。我不想返回空值,而是“退回”到最近的已知价格,在这个例子中是110

qeeaahzv

qeeaahzv1#

SELECT product.product, product.description, isnull(pr_curr.price, pr_fut.price) as price
FROM product 
left join PRICE pr_curr on product.product=pr_curr.product 
and GETDATE() BETWEEN pr_curr.FromDate and pr_curr.ToDate

left join PRICE pr_fut on product.product=pr_fut.product 
and GETDATE() > pr_fut.FromDate 

where pr_fut.FromDate = (
select max(FromDate) from PRICE dates 
where dates.product=pr_fut.product and dates.FromDate<GETDATE()
) or pr_fut.FromDate is null
pnwntuvh

pnwntuvh2#

这不是最快的查询,因为它将产品与所有具有未来日期的记录连接在一起。但是如果你的table很小,那就行了。

SELECT product.product, product.description, isnull(pr_curr.price, pr_fut.price) as price
FROM product 
left join PRICE pr_curr on product.product=pr_curr.product 
and GETDATE() BETWEEN pr_curr.FromDate and pr_curr.ToDate
left join PRICE pr_fut on product.product=pr_fut.product 
and GETDATE() < pr_fut.FromDate 
where pr_fut.FromDate = (
select min(FromDate) from PRICE dates 
where dates.product=pr_fut.product and dates.FromDate>GETDATE()
) or pr_fut.FromDate is null
nmpmafwu

nmpmafwu3#

这看起来像sql server代码,它支持通过 apply 关键字。假设您只需要一个匹配项:

from product p outer apply
     (select top (1) ab.*
      from autobaf ab
      where ab.product = p.product and
            getdate() <= ab.todate
      order by ab.todate desc
     ) ab

请注意,这与 product ,这不是你问题的一部分。
如果不需要,则可以使用:

from t left join
     (select top (1) ab.*
      from autobaf ab
      where getdate() <= ab.todate
      order by ab.todate desc
     ) ab
     on 1 = 1

如果你知道过去有一些记录,那么你可以使用 cross join 而不是 left join 并免除 on 条款。

相关问题