SQL 找到具有共同 parents 的 children 组
SQL to find set of children with common parents
在我的 db2 数据库中,我有三个表。
- 计算机
- Computer_Software
- 软件
这存储了每台计算机安装了多个软件项的关系。所以 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_id
和 software_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
在我的 db2 数据库中,我有三个表。
- 计算机
- Computer_Software
- 软件
这存储了每台计算机安装了多个软件项的关系。所以 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_id
和 software_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