查找只有两行的 table。访问 2016

Find table with only two rows. Access 2016

我正在寻找可以在 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

在上面的示例 table 中,我将因此得到 CompanyID = 4

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

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

非常感谢任何反馈。

您可以使用 INNER JOIN 来过滤不包含这两个值的结果:

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 的结果相结合。只会返回两行都匹配的结果(因为 INNER JOIN)。

既然你说:

So all CompanyID that has only two rows with specific values... In the example table above I will therefore get the CompanyID = 4.

您似乎需要 CompanyID,其中仅有的两个 Product_Name 值是 IpadIphone 没有其他值CompanyID.

关联

要获得此结果,我可能会建议以下 SQL 查询:

select t.companyid
from data t
group by t.companyid
having max(t.product_name in ('Iphone','Ipad'))=-1

哪个 return:

CompanyID
4

此处,对于与给定 CompanyID 关联的每组记录中的每条记录,计算表达式 t.product_name in ('Iphone','Ipad')

此表达式将为 return True (-1) 或 False (0)。

如果组内所有条记录为'Iphone''Ipad',则此表达式将return为真(-1) 对于每条记录,组内的最大值将为 -1.

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

虽然迟到了,但看起来它们只是从一个 table - 数据中提取出来的。如果是这种情况,那么最简单的解决方案应该是

SELECT DATA.CompanyID
FROM (DATA)
WHERE DATA.Product_Name = "Iphone"
  AND DATA.Product_Name = "Ipad";

对于Access,FROM语句一般只用于组合table,或者查询,数据操作在其他语句中。

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

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