2011-10-06 27 views
0

我有一个表格用于其他两个表格之间的链接/关系表格,一张客户表格和一个表格组。一个小组由一个或多个顾客组成。链接表就像给出成员名单的选择ID

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会从上述示例返回

然后,我将不得不链接到应用程序表以使用其创建的时间戳来标识组存在的最新应用程序我可以从组表中提取正确的/最新的信息。

有没有人有任何想法,这是否是最有效的方式来做到这一点?如果还有更快更清洁的方式,我会很感激你的想法。

回答

2

这闻起来像一个部门:

Division sample

Other related stack overflow question

考虑看看提供的链接,您会看到解决但从关系alegebra的观点类似的问题,不似乎更快,可以说是更清洁。

我一开始并没有看到你的解决方案,当我解决了这个问题后,我发现你的解决方法和你一样。

其实,我想这:

<number of ids in list> 

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

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

但显然,我错了。如果我是你,我会和你现在的解决方案保持一致。

+1

谢谢,是的,我花了一些时间看它,这是我可以想出的最好...想把它扔到社区进行验证。作为一名与其他团队不同时区的远程工作人员,有时很难说服自己正确的解决方案,而没有其他人注意它。 – MadMurf