Sql 查找只有两行的表。访问2016

Sql 查找只有两行的表。访问2016,sql,ms-access,ms-access-2010,Sql,Ms Access,Ms Access 2010,我正在寻找一个可以在MS Access 2016中使用的查询,该查询将为我提供所有具有值“Iphone”和“Ipad”的公司ID。因此,只有两行具有特定值的所有CompanyID CompanyID Product_Name 1 Iphone 1 Ipad 1 Headphones 2 Iphone 2 Galaxy 3 Playstation 4 3

我正在寻找一个可以在MS Access 2016中使用的查询,该查询将为我提供所有具有值
“Iphone”
“Ipad”
的公司ID。因此,只有两行具有特定值的所有
CompanyID

CompanyID   Product_Name
1           Iphone
1           Ipad
1           Headphones
2           Iphone
2           Galaxy
3           Playstation 4
3           Nintendo Switch
4           Iphone
4           Ipad
因此,在上面的示例表中,我将获得
CompanyID=4

我尝试使用与this中的SQL相同的逻辑,但Access不允许使用语法
。
post中使用的SQL查询为:

SELECT CompanyID
FROM DATA AS a
  JOIN DATA AS b
  USING (CompanyID)
WHERE a.Product_Name = "Iphone"
  AND b.Product_Name = "Ipad";

非常感谢您的反馈

您可以使用
内部联接
来过滤不同时包含两个值的结果:

SELECT  a.CompanyID
  FROM  (
        SELECT  CompanyID
          FROM  DATA
          WHERE Product_Name = 'IPhone'
        ) a
    INNER JOIN (
               SELECT  CompanyID
                 FROM  DATA
                 WHERE Product_Name = 'Ipad'
               ) b ON b.CompanyID = a.CompanyID
输出:

CompanyID
1
4
这是如何工作的?

首先,收集所有带有
IPhone
的结果。然后,这与所有带有
IPad
的结果结合在一起。仅返回两行匹配的结果(因为内部联接)。

因为您声明:

所以所有的
CompanyID
,只有两行具有特定值的。。。在 因此,上面的示例表将获得
公司ID=4

似乎您需要的是
CompanyID
,其中只有两个
Product\u Name
值是
Ipad
Iphone
没有与
CompanyID
相关的其他值

要获得此结果,我建议使用以下SQL查询:

选择t.companyid
从数据t
t.companyid分组
最大值(t.product_name in('Iphone','Ipad'))=-1
将返回:

CompanyID
4
这里,对于与给定
CompanyID
相关联的每组记录中的每个记录,计算('Iphone','Ipad')
中的表达式
t.product\u name

此表达式将返回True(
-1
)或False(
0

如果组中的所有记录都是
'Iphone'
'Ipad'
,则此表达式将为每个记录返回True(
-1
),组中的最大值为
-1


然而,如果组中的任何记录是其他值,则此表达式将返回False(
0
),因此组的最大值将为
0
,从而将其从结果中排除。

虽然晚些时候,它们看起来只是从一个表数据中提取出来的。如果是这样,那么最简单的解决方案应该是

SELECT DATA.CompanyID
FROM (DATA)
WHERE DATA.Product_Name = "Iphone"
  AND DATA.Product_Name = "Ipad";
对于访问,FROM语句通常仅用于组合表或查询,而数据操作在其他语句中进行

如果有多个表,并且两个表之间的连接是CompanyID,那么它应该更像这样

SELECT DATA1.CompanyID
FROM (DATA1 INNER JOIN DATA1.CompanyID ON DATA2.CompanyID) 
WHERE DATA2.Product_Name = "Iphone"
  AND DATA2.Product_Name = "Ipad";

这实际上是我想要实现的,因为我只获得相关的值,不需要做额外的过滤。谢谢你提供这个答案。非常感谢!