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

时间:2015-03-06 01:19:06

标签: sql db2

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

  1. 计算机
  2. Computer_Software
  3. 软件
  4. 存储每台计算机安装了多个软件项的关系。所以Computer_Software只有一个计算机和软件的外键。

    我需要一个针对给定计算机集返回的查询,所有计算机上都安装了软件列表。

    所以它会是这样的:

    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。 是否有某种嵌套的选择类型我可以做到这一点?

3 个答案:

答案 0 :(得分:2)

如果您的computer_software表格中有一列computer_idsoftware_id,并且该计算机上的每台计算机和软件都有一行 - 正如我想象的那样 - 那么您可以计算行数计算机是1/2/5,group by computer_id,计数等于3(软件出现在所有3台计算机上):

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

答案 1 :(得分:0)

约翰, 我有点生疏,但使用带有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行,那么应该以此为出发点。

答案 2 :(得分:0)

不是使用嵌套选择,而是在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);