2011-09-30 6 views
1

두 테이블 사이에 많은 카디널리티가 여러 개있는 2 개의 테이블이 있습니다. 그래서 정상화에 의해 나는 이것을 만들었습니다 :SQL 쿼리에서 Intersect 연산자를 사용하는 대신

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 개체의 조합을 가진 사용자를 검색 할 수도 있습니다. 너무 많은 교차로를 작성하는 것은 신중하지 않습니다.

나는 postgeql 9.1을 연구 중이다.

이렇게하는 다른 효율적인 방법은 무엇입니까?

답변

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 
+0

thnx : 우리가 사용 할 수도 합류? – codecool

+0

@codecool : 물론입니다. 가입하고자하는 것에 대한 추가 세부 정보를 제공 할 수 있습니까? –

+0

나는 이런 식으로 이야기하고 있었다. http://stackoverflow.com/questions/1878255/select-from-two-same-table-with-intersect/1878315#1878315 하지만이 경우에는 7 개의 조인이 필요하다. 그것은 효율적이지 않을 것입니다. – codecool

관련 문제