在日期进行子选择

时间:2013-03-16 13:52:13

标签: sql ms-access subquery

在Access数据库中有两个表。

表1包含文章,表2包含价格。

所以文章是所有文章和价格的描述 表只包含商品编号,日期日期和价格。 如果价格发生变化,价格会增加新的一行。

价格具有使用该价格的日期。

现在我想获得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<#01/10/2012#。 结果是现在有430篇文章,之前我只有260篇文章。

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

此选择的正确形式是什么?

1 个答案:

答案 0 :(得分:2)

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
   ;