SQL仅选择最高日期
对于一个项目,我想生成一个价目表。 我只想从每个供应商那里得到每件商品的最新价格 只有那两张桌子SQL仅选择最高日期,sql,database,ms-access,select,subquery,Sql,Database,Ms Access,Select,Subquery,对于一个项目,我想生成一个价目表。 我只想从每个供应商那里得到每件商品的最新价格 只有那两张桌子 Table articles ARTNR | TXT | ACTIVE | SUPPLIER ------------------------------------------ 10 | APPLE | Y | 10 20 | ORANGE | Y | 10 30 | KE
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时,我可以看到它们应该在resultset中
有什么问题?获取最新价格的子查询没有考虑其他条件,即当获取最新价格时,您可能会获取另一个价格组中的价格或该价格组未处于活动状态。当您将其加入到没有非活动价格且只有单个价格组中的价格的筛选列表中时,您不会得到这两个价格组中存在的点击率 您需要复制或-更好-将您的条件移动到子查询中,以获得条件下的最佳价格。我不能针对access进行测试,但是如果SQL不是太有限的话,这样的测试应该是可能的 选择a.artnr、a.txt、a.active、a.supplier、p.prcgrp、p.prcdat、p.price 从文章a内部连接价格p在a.ARTNR=p.ARTNR 参加 选择a.artnr,MAXp.prcdat prcdat 从文章a中加入a.artnr=p.artnr上的价格p 其中a.active='Y'和a.supplier=10和p.prcgrp=10 a.artnr z分组 关于a.artnr=z.artnr和p.prcdat=z.prcdat 由a.ARTNR订购 如果access中的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;
请注意,由于在识别唯一价格方面的限制,价格中没有主键,如果同一物品的多个价格具有相同的prcdat,则查询可能会给出重复的价格。如果这是一个问题,您可能还需要在子查询之外复制您的条件。将WHERE art.ARTNR=PRICES.ARTNR更改为WHERE art.ARTNR=ARTICLES。artnr@Mihai谢谢你的评论。我试过了,但是在缺少文章的情况下得到了相同的结果。一个简单的方法是在子查询中重复WHERE条件。已经完成了,但是现在只考虑了所有文章中的最高日期,而不是一篇文章中的最高日期。你是对的。我错过了得到我想要的最新价格的途径。通过您的查询,在a.artnr=p.artnr join…@MareInfinitus添加了一个带有常规子查询的替代项后,我得到一个零件缺少运算符错误。非常感谢。现在我在子查询部分有一个语法错误,从p.prcdat=。但这一切看起来都是完全合法的。我不太喜欢访问。。。