SQL 找到具有共同 parents 的 children 组

SQL to find set of children with common parents

在我的 db2 数据库中,我有三个表。

  1. 计算机
  2. Computer_Software
  3. 软件

这存储了每台计算机安装了多个软件项的关系。所以 Computer_Software 只有计算机和软件的外键。

我需要一个查询 returns 给定的一组计算机,所有这些计算机上安装的软件列表。

所以它会是这样的:

select id from software where computer_id = 1 
intersect
select id from software where computer_id = 2
intersect 
select id from software where computer_id = 5 

但我需要在列表中提供 computer_ids。 是否有某种嵌套 select 类型的方法可以做到这一点?

约翰, 我有点生疏,但在 IN 语句中使用子句应该可以解决问题,例如

select software.id from software
where software.id in 
(
 select computer_software.softwareid from computer_software
 where computer_software.computerid in (1,2,5)
)

这不是获得结果的最有效方式。我想您需要使用外连接来提高查询效率。但是,如果您在计算机和软件表中没有 100,000 行,那么它应该可以作为起点。

不使用嵌套选择,而是对 3 个表的集合使用内部联接。这样效率更高

SELECT software.* FROM software 
  INNER JOIN computer_software ON
     computer_software.software_id = software.id
  INNER JOIN computer ON 
     computer_software.computer_id = computer.id 
  WHERE computer.id IN (1,2,3);

如果您的 computer_software table 有一列 computer_idsoftware_id 并且每台计算机和该计算机上的软件有一行 - 正如我想象的那样 -然后您可以计算计算机为 1/2/5 的行,按 computer_id 分组,计数等于 3(该软件出现在所有 3 台计算机上):

select software_id
  from computer_software
 where computer_id in (1, 2, 5)
 group by software_id
having count(*) = 3