2013-03-16 121 views
0

在Access数据库中有两个表。日期选择

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

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

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

现在,我想这是有效的01月2012年 我用现在的价格我查询并添加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?

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

+0

'(Prices.PRSGR)= 0'是什么意思?您至少应该在子查询中复制该子句。 – wildplasser 2013-03-16 14:03:13

+0

如果你自己运行子查询,它会返回什么? – 2013-03-16 14:09:21

+0

@wildplasser有价格组,我对价格组0有兴趣。 – 2013-03-16 14:24:54

回答

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 
    ; 
+0

非常感谢!但结果集是空的。 – 2013-03-16 14:58:02

+0

也许我犯了一个错误,或者有*没有记录*满足您的条件。我不知道日期文字格式'#02/10/2012#',它看起来对我很可疑,也许它接受一个iso日期,比如'2013-03-16'? – wildplasser 2013-03-16 15:02:25

+0

没有错误,您的查询结果正是它应该。不知道什么是错的。非常感谢你! – 2013-03-16 17:31:02