SQL以查找具有共同父项的子项集
在db2数据库中,我有三个表 计算机 计算机软件 软件 这将存储每台计算机安装了多个软件项的关系。因此,计算机软件只是有一个外键的计算机和软件 我需要一个查询,返回一组给定的计算机,所有计算机上安装的软件列表 所以应该是这样的: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
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刚刚更改,是的,我不知道为什么我想得太多了。谢谢