【问题标题】:Alternative for using Intersect operator in my sql query在我的 sql 查询中使用相交运算符的替代方法
【发布时间】:2011-09-30 14:51:22
【问题描述】:

我有 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。

实现这一目标的其他有效方法是什么?

【问题讨论】:

    标签: sql postgresql many-to-many intersection


    【解决方案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
    

    【讨论】:

    • thnx :) 我们也可以使用连接来做到这一点吗?
    • @codecool:当然。您能否提供有关您想加入的更多详细信息?
    • 我在谈论这样的事情stackoverflow.com/questions/1878255/… 但我的用例将需要 7 个连接才能做到这一点,这不是很有效吗?
    • @codecool:是的,我不会对你的特殊情况采取这种方法。
    • @codecool:如果您在(user_id, object_id) 上有一个唯一 约束(或主键),这在这种情况下很常见,您可以跳过@987654325 @。此外,PostgreSQL 中的标识符不区分大小写,只要您不使用双引号即可。我个人的建议是远离混合大小写标识符。
    猜你喜欢
    • 2021-11-13
    • 2011-12-29
    • 2013-06-17
    • 2017-01-08
    • 2015-06-24
    • 2020-05-25
    • 2021-03-07
    • 2016-04-09
    • 1970-01-01
    相关资源
    最近更新 更多