SQL只选择最高日期

时间:2014-10-04 10:10:01

标签: sql database ms-access select subquery

对于我想要生成价目表的项目。 我想从每个供应商处获得每篇文章的最新价格。

只有那两张桌子。

Table articles

 ARTNR  | TXT           | ACTIVE    | SUPPLIER
 ------------------------------------------
 10     | APPLE         | Y         | 10
 20     | ORANGE        | Y         | 10
 30     | KEYBOARD      | N         | 20
 40     | ORANGE        | Y         | 20
 50     | BANANA        | Y         | 10
 60     | CHERRY        | Y         | 10


Table prices
 ARTNR  | PRCGRP    | PRCDAT    | PRICE
 --------------------------------------
 10     | 10        | 01-Aug-10 | 2.1
 10     | 10        | 05-Aug-11 | 2.2
 10     | 10        | 21-Aug-12 | 2.5
 20     | 0         | 01-Aug-10 | 2.1
 20     | 10        | 09-Aug-12 | 2.3
 10     | 10        | 14-Aug-13 | 2.7

这是我到目前为止所做的:

SELECT 
    ARTICLES.[ARTNR], ARTICLES.[TXT], ARTICLES.[ACTIVE], ARTICLES.[SUPPLIER],   PRICES.PRCGRP, PRICES.PRCDAT, PRICES.PRICE
FROM 
    ARTICLES INNER JOIN PRICES ON ARTICLES.ARTNR = PRICES.ARTNR
WHERE 
    (
    (ARTICLES.[ACTIVE]="Y") AND 
    (ARTICLES.[SUPPLIER]=10) AND 
    (PRICES.PRCGRP=0) AND
    (PRICES.PRCDAT=(SELECT MAX(PRCDAT) FROM PRICES as art WHERE art.ARTNR =     PRICES.artnr) )
    )
ORDER BY ARTICLES.ARTNR
;

每次只选择一个供应商是可以的,但我想要最高价格。

问题是: 上面的查询没有显示很多文章, 但我无法弄清楚出了什么问题。

当我在max prcdat上省略subselect时,我可以看到它们应该在结果集中。

有什么问题?

1 个答案:

答案 0 :(得分:2)

您的子查询获取最新价格并不考虑其他条件,即当您获得最新价格时,您可能会在另一个价格组中获得价格或者不活跃。如果您针对已过滤的列表加入该列表,该列表中没有非活动价格且只有单个价格组中的价格,则两者都不会存在匹配。

您需要复制或 - 更好 - 在子查询中移动您的条件以在条件下获得最佳价格。我无法对访问进行测试,但如果SQL不是太有限,就可以;

SELECT a.artnr, a.txt, a.active, a.supplier, p.prcgrp, p.prcdat, p.price
FROM articles a INNER JOIN prices p ON a.ARTNR = p.ARTNR
JOIN (
  SELECT a.artnr, MAX(p.prcdat) prcdat
  FROM articles a JOIN prices p ON a.artnr = p.artnr
  WHERE a.active='Y' AND a.supplier=10 AND p.prcgrp=10
  GROUP BY a.artnr) z
ON a.artnr = z.artnr AND p.prcdat = z.prcdat
ORDER BY a.ARTNR

如果访问中的SQL支持不允许使用子查询进行连接,则只需在现有子查询中移动条件,例如;

SELECT a.artnr, a.txt, a.active, a.supplier, p.prcgrp, p.prcdat, p.price
FROM articles a INNER JOIN prices p ON a.ARTNR = p.ARTNR
WHERE p.prcdat = (
   SELECT MAX(p2.prcdat) 
   FROM articles a2 JOIN prices p2 ON a2.artnr = p2.artnr
   WHERE a.artnr = a2.artnr AND a2.active='Y' AND a2.supplier=10 AND p2.prcgrp=10
)
ORDER BY a.ARTNR;

请注意,由于识别唯一价格的限制(价格中没有主键),如果同一商品的多个价格具有相同的价格,则查询可能会给出重复。如果这是一个问题,您可能也需要在子查询之外复制条件。