SQL Query,当一个孩子匹配时,以一对多的关系返回所有孩子

时间:2013-06-13 16:06:06

标签: sql db2 one-to-many

我正在努力增强对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)

是的,链接表并不理想,但它们基本上是规范化的表,其中包含与我正在运行的查询无关的其他信息。我们必须从过滤的Group集开始,加入People,然后返回以获取与People关联的所有组。

我想做的是从People开始,加入Group,如果Bob从子查询返回的任何组,则返回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

第一个查询中的连接数使它很大程度上无法使用,因为它们是一些非常大的表。如果可能的话,第二种情况会更加理想。

1 个答案:

答案 0 :(得分:0)

从问题来看,我认为您正在查询分层数据。 DB2提供了处理此类数据的工具。在DB2中有两个子句开头和连接,这将是有用的。它们被解释为here