SQL以查找具有共同父项的子项集

SQL以查找具有共同父项的子项集,sql,db2,Sql,Db2,在db2数据库中,我有三个表 计算机 计算机软件 软件 这将存储每台计算机安装了多个软件项的关系。因此,计算机软件只是有一个外键的计算机和软件 我需要一个查询,返回一组给定的计算机,所有计算机上安装的软件列表 所以应该是这样的: select id from software where computer_id = 1 intersect select id from software where computer_id = 2 intersect select id from softwa

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

计算机 计算机软件 软件 这将存储每台计算机安装了多个软件项的关系。因此,计算机软件只是有一个外键的计算机和软件

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

所以应该是这样的:

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 
但我需要在列表中提供计算机ID。 有什么嵌套的选择类型的方法可以做到这一点吗?

John, 我有点生疏了,但是在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)
)

这不是获得结果的最有效方式。我想您需要使用外部联接来提高查询的效率。但是,如果您的计算机和软件表中没有100000行,则应以这一技巧作为起点。

不要使用嵌套选择,而是在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表有一列computer_id和software_id,并且该计算机上的每台计算机和软件都有一行-如我所想象的-那么您可以计算计算机为1/2/5的行,按计算机id分组,计数等于3,软件将显示在所有3台计算机上:

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

这似乎给了我联合,而不是交叉点。这和这样做不一样:从computer_software中选择软件,其中computerid在1,2,5中?@JohnC-是的,它是。不,它不会得到你想要的,它会返回任何软件,而不是全部。Dorje-优化器能够为IN子句生成连接计划。更好的方法是使用HAVING子句。@Clockwork Muse刚刚更改,是的,我不知道为什么我想得太多了。谢谢