在我的SQL查询中使用Intersect运算符的替代方法

时间:2011-09-30 14:51:22

标签: sql postgresql many-to-many intersection

我有2张桌子,它们之间有多对多的基数。因此,通过规范化,我创建了这个:

   User
   UserId  UserName ....
     1       a
     2       b

  UserObject
  UserId  ObjectId
     1        1
     1        2
     2        2

  Object
  ObjectId  ObjectName
     1        c
     2        d

现在我想运行一个查询,我想知道有特定对象的用户。

例如:具有对象c和d的所有用户。

一种方法

   Select userid from UserObject where objectid=1 intersect Select userid from UserObject where objectid= 2

根据我的用例,我可能需要搜索具有2-7个对象组合的用户。写这么多十字路口是不明智的。

我正在研究postgesql 9.1。

实现这一目标的其他有效方法有哪些?

1 个答案:

答案 0 :(得分:1)

SELECT uo.UserId
    FROM UserObject uo
    WHERE uo.ObjectId IN (1,2)
    GROUP BY uo.UserId
    HAVING COUNT(DISTINCT uo.ObjectId) = 2

为7个对象扩展此概念:

SELECT uo.UserId
    FROM UserObject uo
    WHERE uo.ObjectId IN (1,2,3,4,5,6,7)
    GROUP BY uo.UserId
    HAVING COUNT(DISTINCT uo.ObjectId) = 7
相关问题