Альтернатива для использования оператора пересечения в моем запросе sql - PullRequest
1 голос
/ 30 сентября 2011

У меня есть 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 Ответ

1 голос
/ 30 сентября 2011
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
...