对于我想要生成价目表的项目。 我想从每个供应商处获得每篇文章的最新价格。
只有那两张桌子。
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时,我可以看到它们应该在结果集中。
有什么问题?
答案 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;
请注意,由于识别唯一价格的限制(价格中没有主键),如果同一商品的多个价格具有相同的价格,则查询可能会给出重复。如果这是一个问题,您可能也需要在子查询之外复制条件。