在给定成员列表的情况下选择ID

时间:2011-10-06 00:44:27

标签: sql select db2

我有一个表,用于表示其他两个表之间的链接/关系,一个客户表和一个表组。一个组由一个或多个客户组成。链接表就像

APP_ID | GROUP_ID | CUSTOMER_ID
1      |     1    |    123
1      |     1    |    124
1      |     1    |    125
1      |     2    |    123
1      |     2    |    125
2      |     3    |    123
3      |     1    |    123
3      |     1    |    124
3      |     1    |    125

我现在有需要,给定一个客户ID列表,以便能够获取该客户ID列表的组ID。组ID可能不唯一,相同的组ID将包含相同的客户ID列表,但该组可能存在于多个app_id中。

我在想

SELECT APP_ID, GROUP_ID, COUNT(CUSTOMER_ID) AS COUNT
FROM GROUP_CUST_REL 
WHERE CUSTOMER_ID IN ( <list of ids> )
GROUP BY APP_ID, GROUP_ID
HAVING COUNT(CUSTOMER_ID) = <number of ids in list>

将返回包含给定列表中所有客户ID的所有组ID,并仅返回那些组ID。因此,对于(123,125)的列表,将仅从上面的示例

返回组ID 2

然后我必须链接app表以使用其创建的时间戳来识别该组所存在的最新应用程序,以便我可以从组表中提取正确/最新的信息。

有没有人想过这是否是最有效的方法?如果有另一种更快/更清洁的方式,我会感激你的想法。

1 个答案:

答案 0 :(得分:2)

这闻起来像是一个分裂:

Division sample

Other related stack overflow question

看一下所提供的链接,你会看到从关系代数的观点来看类似问题的解决方案,似乎不会更快,也可以更清晰。

我一开始并没有看你的解决方案,当我解决这个问题时,我发现你已经解决了这个问题。

实际上,我想到了这个:

<number of ids in list>

可以变成这样的东西(这样你就不需要额外的参数):

select count(*) from (<list of ids>) as t 

但显然,我错了。如果我是你,我会继续使用你当前的解决方案。