我有两张桌子,两张桌子之间有多对多的基数。所以通过规范化,我创建了:

   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个对象组合的用户。写这么多交集是不明智的。
我正在研究Postgesql9.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

关于sql - 在我的SQL查询中使用Intersect运算符的替代方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7612154/

10-11 01:55