在我的db2数据库中,我有三个表。
存储每台计算机安装了多个软件项的关系。所以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。 是否有某种嵌套的选择类型我可以做到这一点?
答案 0 :(得分:2)
如果您的computer_software
表格中有一列computer_id
和software_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);