访问查询,如果一列中存在两个值,则省略一个

时间:2017-03-08 15:33:20

标签: sql ms-access

我有一系列查询生成包含化学数据的报告。有两种化合物A和B,其中A是总量,B是指定量(例如总铁和亚铁)。

查询结果中总共有大约100种化合物,我需要一个标准来过滤结果,这样如果化合物A和B都存在,则只显示化合物B.到目前为止,我已经尝试在查询构建器的条件部分添加一些iif语句而没有运气。

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

SELECT Table1.KEY_ANLT
FROM Table1
WHERE (((Table1.KEY_ANLT)=IIf([Table1].[KEY_ANLT]=1223 And [Table1].[KEY_ANLT]=70,70,1223)));

这会过滤掉化合物A,但不包括其他化合物。如何修改查询以包含其他化合物?

1 个答案:

答案 0 :(得分:0)

因此,为了澄清上面的一些评论,这里的问题是你没有(或者没有在上面说明)一种方法来识别合在一起的值。你给了70和1223作为例子,但如果你给我们一个所有数字的列表,我们如何能够确定哪些数字一起?您可能会说“化学专业知识”,但这是基于化合物名称的另一个专栏,对吧?实际上,您的查询应该使用该列。但是,仍然存在如何连接相关名称的问题(例如,“总铁”和“亚铁”可能是连接的,因为它们都有“铁”这个词,但是“高锰酸盐”和“锰”呢?)。简而言之,您需要另一列来指定这些单独行之间的共同点,无论是元素,离子,电荷等。您还需要一列来标识您希望在查询中包含的每个“组”中的哪一行(或者,哪些要排除)。例如:

+----------+-----------------+---------+---------+
| KEY_ANLT |    Compound     | Element | Primary |
+----------+-----------------+---------+---------+
|       70 | total iron      | Fe      | Y       |
|     1223 | ferrous iron    | Fe      |         |
|     1224 | ferric iron     | Fe      |         |
|      900 | total manganese | Mn      | Y       |
|      901 | permanganate    | Mn      |         |
+----------+-----------------+---------+---------+

然后,要获得仅显示“主要”行的查询,这非常简单:

SELECT * FROM Table1 WHERE Primary='Y';

如果没有[主要]列,您必须决定如何选择每一行。也许你想要一个KEY_ANLT最小的那个?

SELECT Table1.*
FROM
    (SELECT Element, min(KEY_ANLT) AS MinKey FROM Table1 GROUP BY Element) AS Subquery
    INNER JOIN Table1 ON 
        Subquery.Element=Table1.Element AND
        Subquery.MinKey=Table1.KEY_ANLT

您的查询不起作用的原因是WHERE子句逐行操作,并且不会将不同的行相互比较。所以在你的SQL中:

IIf([Table1].[KEY_ANLT]=1223 And [Table1].[KEY_ANLT]=70,70,1223)

没有行会将其评估为70,因为没有单行具有KEY_ANLT = 1223 AND KEY_ANLT = 70。每行只有一个KEY_ANLT值。那么,对于每一行,IIF表达式的计算结果为1223,并且您的条件将仅返回KEY_ANLT = 1223(化合物B)的行。