2017-03-08 69 views
1

我有一系列生成包含化學數據的報告的查詢。有兩種化合物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,但不包括該化合物的其餘部分。我如何修改查詢以包含其他化合物?

+0

最好是發佈示例SQL。 – Fionnuala

+0

或一些樣本數據 – marlan

+0

此外,您似乎可能有一個不符合正常標準的表格設計。 – Fionnuala

回答

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)的行。