SQL只选择最高日期

标签 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 上的子选择时,我可以看到它们应该在结果集中。

怎么了?

最佳答案

您获取最新价格的子查询没有考虑其他条件,也就是说,当您获取最新价格时,您可能会获得另一个价格组中的价格或不活跃的价格。当您将其加入没有非事件价格且只有单个价格组中的价格的过滤列表时,您不会获得两者都存在的匹配。

您需要复制或 - 更好 - 将您的条件移动到子查询中以获得条件下的最佳价格。我无法针对 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
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

如果 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,则查询可能会重复。如果这是一个问题,您可能还需要在子查询之外复制您的条件。

关于SQL只选择最高日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26191764/

相关文章:

python - 如何对数据库中的登录进行建模?

sql - 当最右边的表为空时,Access (JET Red) 中的 LEFT OUTER JOIN 返回零行 - 为什么?

ms-access - MS Access TextBox 值始终为 NULL

sql - 大丑陋的SQL查询问题

java - 如何在 Spring jdbcTemplate 中将 Array/List 设置为参数?

java - 如何将数据存入MySQL数据库?

mysql - 如何将数据库中不存在的任意值添加到 MySQL SELECT 中的选定行?

android - Room - 是否可以在查询中使用 OFFSET 和 FETCH NEXT?

mysql - Laravel-Lumen API 的数据库设计

java - 是否可以将数据库凭据存储在 hibernate.cfg.xml 中