我发现自己在使用 SQL 查询时遇到了一些不可行的情况,我希望自己遗漏了一些东西或者可能会学到一些新东西。我正在使用的 DB2 数据库的结构并不是为这种查询而构建的,但我的任务是......
假设我们有餐桌人员和餐桌组。组可以包含多个人,一个人可以是多个组的一部分。是的,已经很乱了。无论如何,有几个中间表将两者联系起来。问题是我需要从一组组列表开始,获取这些组中的所有人员,然后获取这些人员所属的所有组,这将是初始组集的超集。这将意味着从团体开始,加入到人中,然后返回并再次加入团体。我也需要来自结果集中两个表的信息,因此排除了许多技术。
我必须将其与许多其他表结合起来以获取更多信息,并且查询变得庞大、繁琐且缓慢。我想知道是否有某种方法可以从 People 开始,将其加入 Groups,然后指定如果一个人在提供的一组组中拥有一个组(通过子查询完成),那么 ALL 组因为那个人应该被退回。我不知道实现这一点的方法,但我在想(希望)有一种相对干净的方法可以在 SQL 中实现这一点。
一个快速而肮脏的例子:
SELECT ...
FROM GROUPS g
JOIN LINKING_A a
ON g.GROUPID = a.GROUPID
AND GROUPID IN (subquery)
JOIN LINKING_B b
ON a.GROUPLIST = b.GROUPLIST
JOIN PEOPLE p
ON b.PERSONID = p.PERSONID
--This gets me all people affiliated with groups,
-- but now I need all groups affiliated with those people...
JOIN LINKING_B b2
ON p.PERSONID = b2.PERSONID
JOIN LINKING_A a2
ON b2.GROUPLIST = a.GROUPLIST
JOIN GROUPS g2
ON a2.GROUPID = g.GROUPID
然后我可以从结果集中的 p 和 g2 返回信息。你可以看到我在哪里遇到了麻烦。这是在一些大表上的很多连接,更不用说在这个查询中执行的许多其他连接了。我需要能够通过将 PEOPLE 加入 GROUPS 来进行查询,然后指定如果任何人在子查询中有关联的组,它应该返回与 PEOPLE 中的该条目相关的所有组。我在想 GROUP BY 可能只是一件事,但我还没有充分使用它来真正知道。因此,如果 Bill 是组 A、B 和 C 的一部分,并且我们的子查询返回一个包含组 A 的集合,则结果集应该包括 Bill 以及组 A、B 和 C。