Sql 在DB2forLUW中,如果只有一行匹配,我可以返回连接中所有相关的行吗

Sql 在DB2forLUW中,如果只有一行匹配,我可以返回连接中所有相关的行吗,sql,db2,one-to-many,Sql,Db2,One To Many,假设我们有表A和表B。从技术上讲,这是一种多对多关系。A中的一个条目可以与B中的多个条目相关联,反之亦然。当我有一个返回一组B项的子查询时,问题就出现了。它们与A相匹配,但我也希望得到B中与A相关联的所有条目,A很可能是子查询的超集。因此,我必须将a连接回B。应该注意的是,我需要从a和B返回信息,这排除了一些可能的技术 我想做的是从A开始,加入B,然后用子查询进行过滤,如果B中的一个条目在子查询中匹配,那么B中与A中的条目关联的所有条目都将返回 例如,假设条目A1与B1、B2和B3关联。如果我们

假设我们有表A和表B。从技术上讲,这是一种多对多关系。A中的一个条目可以与B中的多个条目相关联,反之亦然。当我有一个返回一组B项的子查询时,问题就出现了。它们与A相匹配,但我也希望得到B中与A相关联的所有条目,A很可能是子查询的超集。因此,我必须将a连接回B。应该注意的是,我需要从a和B返回信息,这排除了一些可能的技术

我想做的是从A开始,加入B,然后用子查询进行过滤,如果B中的一个条目在子查询中匹配,那么B中与A中的条目关联的所有条目都将返回

例如,假设条目A1与B1、B2和B3关联。如果我们的子查询包含B1,并且我们从B连接到A,那么我们将得到一行A1和B1。如果我们回到B,我们可以得到A1,B1,B2,B3三行。我想做的是找到一个函数、表达式等,它可以连接a到B,然后看到B1在子查询中,B1与A1关联,所以A1的所有行都返回,我们得到三行B1、B2和B3。如果A2与B4和B5关联,并且它们都不包括在子查询中,那么A2应该从结果中排除。基本上,关联中的一次命中返回关联的所有行。通过这种方式,我们可以将其视为从a到B的一对多关系

要绘制它,请执行以下操作:

A   |   B
----------
A1  |   B1
A1  |   B2
A1  |   B3
A2  |   B4
A2  |   B5
其中A1和B1、B2和B3都是键(实际上是两列随机生成的bigint,但这稍微简化了一些),它们在另一个表中作为外键出现。在第一个示例中:

WITH SUB (ID) AS (Subquery)
SELECT bb.*, aa.*
FROM SUB
JOIN B bb
ON bb.OTHER_ID = SUB.ID
JOIN A aa
ON bb.ID = aa.ID
当子查询返回B1时,它将为我们提供:

A   |   B
----------
A1  |   B1
现在,如果我们将其附加到查询并将SELECT更改为aa.,bb2.:

然后我们得到A1的所有行,如第一个示例表所示。然而,这需要重新加入到B,这是我想要避免的。还要注意,子查询不返回B.ID,而是一个单独的标识符B.ObjyId。
SELECT aa.*, bb.*
FROM A aa
JOIN B bb
ON aa.ID = bb.ID
WHERE
--Insert function here that will take the subquery, and if any row in B 
--is present in the set returned by the subquery, then ALL rows in A that include 
--at least one matching row will be returned with all related rows in B
这是对我实际要做的事情的简化,但原因是将B连接到a,然后再连接到B(由于规范化,中间有一些表)对我来说太昂贵了。有没有一种方法可以做到这一点,那就是只加入a到B,还是我希望得到一些不存在的东西?我不想重写查询以提高可读性。我只是在寻找一种逻辑处理关系的方法,以减少必要连接的数量


很抱歉不止一次地问这个问题,但我认为我不能很好地表达我想做的事情。也许这是不可能的。

表A和表B是如何关联的?公共id或外部参照表或。。。?使用表模式和一些具体的测试数据,示例可能更清晰。True。它们通过ID关联,但由于规范化,有两个中间表通过主键/外键链接在一起。它们不包含与我需要的结果集相关的数据,但它们仍然存在。该示例简化为两个直接链接的表。是的,一组“实际”(匿名)数据/模式将使这一点更加清晰。
SELECT aa.*, bb.*
FROM A aa
JOIN B bb
ON aa.ID = bb.ID
WHERE
--Insert function here that will take the subquery, and if any row in B 
--is present in the set returned by the subquery, then ALL rows in A that include 
--at least one matching row will be returned with all related rows in B