2017-08-29 37 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)