我正在努力增强对 DB2 数据库的查询,但由于需要执行跨大表的连接数才能获取所有数据,我在获得可接受的性能方面遇到了一些问题,我希望有一个可以简化和加速流程的 SQL 函数或技术。
为了分解它,假设有两个表:人员和组。组包含多个人,一个人可以是多个组的一部分。这是多对多的,但请耐心等待。基本上,有一个子查询将返回一组组。从此,我可以加入 People(这需要跨其他表进行额外的连接)以获取这些组中的所有人员。但是,我还需要知道这些人所在的所有组,这意味着再次加入 Groups 表(更多的连接)以获得原始子查询的超集。查询中还有额外的连接来获取其他相关数据,而且成本以一种非常难看的方式加起来。我还需要从两个表中返回信息,以便排除一些技术。
我想做的是能够从 People 表开始,将其加入 Groups,然后将 Groups 与子查询进行比较。如果附加到一个人的组在子查询中有一个匹配项,它应该返回与该人关联的所有组项。
本质上,假设 Bob 是 A、B 和 C 组的一部分。目前,我从组开始,假设只有 A 组从子查询中出来。然后我将 A 加入 Bob,但随后我必须回来并再次将 Bob 加入 Group 以获得 B 和 C。 SQL 示例:
SELECT p.*, g2.*
FROM GROUP g
JOIN LINKA link
ON link.GROUPID = g.GROUPID
JOIN LINKB link1
ON link1.LISTID = link.LISTID
JOIN PERSON p
ON link1.PERSONID = p.PERSONID
JOIN LINKB link2
ON link2.PERSONID = p.PERSONID
JOIN LINKA link3
ON link2.LISTID = link3.LISTID
JOIN GROUP g2
ON link3.GROUPID = g2.GROUPID
WHERE
g.GROUPID IN (subquery)
是的,链接表并不理想,但它们基本上是规范化的表,其中包含与我正在运行的查询无关的附加信息。我们必须从过滤的组集开始,加入人员,然后返回以获取与人员关联的所有组。
我想做的是从 People 开始,加入 Group,如果 Bob 所在的任何 Group 从子查询返回,则应该返回 ALL,所以如果我们让 Bob 加入 A、B、C 和 A在子查询中,它将返回 Bob 的三行到 A、B 和 C,因为至少有一个匹配项。这样,如果我们只关心每个人的组而不是相反,它可以被视为一对多的关系。SQL 示例:
SELECT p.*, g.*
FROM PEOPLE p
JOIN LINKB link
ON link.PERSONID = p.PERSONID
JOIN LINKA link1
ON link.LISTID = link1.LISTID
JOIN GROUP g
ON link1.GROUPID = g.GROUPID
WHERE
--SQL function, expression, or other method to return
--all groups for any person who is part of any group contained in the subquery
第一个查询中的连接数量使其在很大程度上无法使用,因为这些是一些非常大的表。如果这种事情是可能的,第二个会更理想。