2017-08-29 44 views
0

說,我有一個表,看起來像這樣:訪問VBA:只選擇多個值

ID | PNo | MM | CP | 
---|-----|------|----| 
1 | 13 | True | 4 | 
2 | 92 | True | 3 | 
3 | 1 | True | 3 | 
4 | 13 | False| 2 | 
5 | 13 | True | 3 | 
6 | 1 | True | 3 | 

我想通過所有PNOS和所有行與PNO比較,只選擇那些具有不同的價值在MM領域。

我的計劃是創建一個具有不同PNo值的表,使用通常的記錄集遍歷該表,併爲每個PNo編寫一個SQL查詢。 現在我的問題是SQL查詢的構造。

我可以使用Table.PNo = rs(「PNo」)選擇所有行,但我不知道如何制定查詢以捕獲具有不同值的行。

+0

不知道你的意思。瀏覽每個「PNo」 - 即1,13和92.選擇那些在「MM」中具有不同值的MM - MM爲TRUE/FALSE。所以1只有TRUE,所以什麼都不顯示,因爲沒有什麼不同於那個值? 92有1條記錄,所以沒有什麼不同的價值? 13有TRUE和FALSE - 作爲一個布爾值只能有TRUE和FALSE,那麼沒有什麼不同,因此..顯示一個空表? –

+0

對不起,可能不是很清楚。 我想選擇ID爲1,4,5的行,因爲它們在MM中有兩個不同的值:True和False。我不想要ID爲3,6的行,因爲它們只有在MM中的值爲True。 – nvrslnc

回答

0

認爲這應該工作。

這將在我們的PNo領域創建一個笛卡爾產品。即連接到每個記錄(但僅在該PNo上)的每條記錄。

SELECT * 
FROM Table1 T1 INNER JOIN Table1 T2 ON T1.PNo = T2.PNo 

最終你會用1 PNO 13,4和9組的實例和92. 1現在我們只是想要回那些其中MM是不同的,所以添加到WHERE子句。

SELECT * 
FROM Table1 T1 INNER JOIN Table1 T2 ON T1.PNo = T2.PNo 
WHERE T1.MM <> T2.MM 
ORDER BY T1.ID 

這將返回四條記錄。 PNo 1和92將消失,因爲MM的結果對於那些人來說是相同的。 ID 4號將返回兩倍於MM值是不同的ID 1和ID 5

要刪除重複值,那麼你可以使用DISTINCT:

SELECT DISTINCT T1.ID, T1.PNo, T1.MM, T1.CP 
FROM   Table1 T1 INNER JOIN Table1 T2 ON T1.PNo = T2.PNo 
WHERE   T1.MM <> T2.MM 
ORDER BY  T1.ID 

注:一個@Jonathan和我的答案之間的區別在於他的查詢是可更新的,而我的查詢不是。

0

以下應該做你想要什麼:

SELECT * FROM MyTable WHERE PNo in 
(SELECT t.PNo FROM MyTable t 
INNER join MyTable f 
ON t.PNo = f.PNo 
WHERE t.MM = true and f.MM = false) 

內部聯接,只有那些有PNOS兩個MM虛假和真實的MM包括保證。

1

您可以使用子查詢:

Select * 
From YourTable 
Where PNo IN 
    (Select T.PNo 
    From YourTable   
    Group By PNo, MM 
    Having Count(*) = 2)