【问题标题】:Subselect on date选择日期
【发布时间】:2013-03-16 13:52:13
【问题描述】:

在 Access 数据库中有两个表。

表一包含文章,表二包含价格。

所以文章是所有文章和价格的描述 表只包含一个货号、一个日期日期和一个价格。 如果价格发生变化,则会在价格中添加一个新行。

价格有一个使用该价格的日期。

现在我想获取 2012 年 10 月 1 日有效的价格。 我使用了当前价格的查询并添加了and prsdat<#02/10/2012# 到查询中的子选择。

这是我已经拥有的:

SELECT 
    Articles.ARTNR, 
    Articles.TXT, 
    Articles.ACTIVE, 
    Prices.PRICE, 
    Prices.PRSGR, 
    Prices.PRSDAT
FROM 
    Articles INNER JOIN Prices ON Articles.ARTNR = Prices.ARTNR
WHERE 
    (((Articles.ACTIVE)="Y") AND 
    ((Prices.PRSGR)=0) AND 
    ((Prices.PRSDAT)=
        (SELECT 
            max(prsdat)  
        FROM 
            Prices as art 
        WHERE 
            art.artnr = Prices.artnr and prsdat<#02/10/2012#)))
ORDER BY 
    Articles.ARTNR;

现在选择返回我没有看到的文章 我以前用过,刚刚添加了and prsdat&lt;#01/10/2012#。 结果现在是 430 篇文章,而我之前只有大约 260 篇。

返回的价格较旧,但我不确定日期格式。 在表中我看到 DD.MM.YYYY,在查询中我将使用 MM/DD/YYYY 或 DD/MM/YYYY?

这个选择的正确形式是什么?

【问题讨论】:

  • (Prices.PRSGR)=0 是什么意思?您至少应该在子查询中复制该子句。
  • 如果你自己运行子查询,它会返回什么?
  • @wildplasser 有价格组,我对价格组 0 感兴趣。
  • @DanBracuk 我删除了 art.artnr = Prices.artnrpart 然后从外部选择中复制了 PrsGr=0 部分,然后它返回一个日期。对我来说似乎是正确的。

标签: sql ms-access subquery


【解决方案1】:
SELECT 
    a.ARTNR
    , a.TXT
    , a.ACTIVE -- dubious, since it is constant
    , p.PRICE
    , p.PRSGR  -- dubious, since it is constant
    , p.PRSDAT
FROM Articles a
INNER JOIN Prices p ON a.ARTNR = p.ARTNR
WHERE a.ACTIVE = 'Y' 
  AND p.PRSGR = 0 
  AND p.prsdat < #02/10/2012#
  AND NOT EXISTS (
      SELECT *   
      FROM Prices nx 
      WHERE nx.ARTNR = p.ARTNR
        AND nx.PRSGR = 0
        AND nx.prsdat < #02/10/2012#
        AND nx.prsdat > p.prsdat
          )
ORDER BY 
    Articles.ARTNR
   ;

【讨论】:

  • 非常感谢!但是结果集是空的。
  • 可能是我出错了,或者可能没有记录满足您的条件。我不知道日期文字格式#02/10/2012#,我觉得它很可疑,也许它接受一个iso-date,比如2013-03-16
  • 没有错误,您的查询结果完全符合预期。不知道早先出了什么问题。非常感谢!
猜你喜欢
  • 2021-07-28
  • 1970-01-01
  • 2014-04-22
  • 1970-01-01
  • 2019-03-15
  • 2019-09-28
  • 2017-05-01
  • 2020-02-05
相关资源
最近更新 更多