2012-03-19 2 views
0

여러 관계가있는 간단한 SQL 관계형 모델이 있습니다. 여기에 성분 표구성 테이블에서 교차를 수행하는 방법

 
___________________________ 
| object1_id | object2_id | 
|---------------------------| 

내가 알고 싶습니다에게 모든 object2의 집합에 공통적 인 object1. 내 기본적인 느낌이

SELECT c.object1_id FROM composition c WHERE c.object2_id = <given_id_1> 
INTERSECT 
SELECT c.object1_id FROM composition c WHERE c.object2_id = <given_id_2> 

같은 요청을하는 것입니다 그리고 나는 세트에서 N의 object2이있는 경우, 나는 N은 INTERSECT

SELECT c.object1_id FROM composition c WHERE c.object2_id = <given_id_1> 
INTERSECT 
SELECT c.object1_id FROM composition c WHERE c.object2_id = <given_id_2> 
... 
INTERSECT 
SELECT c.object1_id FROM composition c WHERE c.object2_id = <given_id_N> 

그러나, 그것은 매우 최적화 보이지 않는다 할 것입니다. 너 나 좀 도와 줄 수있어? 나는 실제로 SQL 전문가가 아니다. 나는 그것을하기 위해 JOIN을 사용할 수 있다고 생각합니다.

샘플

 
___________________________ 
| object1_id | object2_id | 
|---------------------------| 
|   10 |   1 | 
|   11 |   1 | 
|   10 |   2 | 
|   12 |   2 | 
|   10 |   3 | 
|   11 |   3 | 
|   13 |   3 | 

{object1_id 예상} 실시 예

  • {object2_id 세트} =>
  • {1, 2} =>을 {10}
  • { 1, 3} => {10, 11}
  • {1, 2, 3} => {10}

답변

2

성능면에서 쿼리는 정상적으로 보입니다. 그것이 실제로 문제가 있는지를 측정 해 보셨습니까? 6 제공 ID의 수입니다

SELECT object1_id 
FROM composition 
WHERE object2_id IN (id1, id2, ..., id6) 
GROUP BY object1_id 
HAVING COUNT(*) = 6 

참고 :

(object1_id, object2_id)의 경우는 좀 더 간결하게 다음과 같이 쿼리를 작성할 수 있습니다 유일하다. 다른 수의 ID가 제공되면 변경해야합니다. 이것이 속도 향상을 가져다 주는지 확인하기 위해 귀하의 dadta에서 실제 성능을 측정해야합니다.

고유성을 가정 할 수없는 경우

다음이 작동합니다 :

SELECT object1_id 
FROM composition 
WHERE object2_id IN (id1, id2, ..., id6) 
GROUP BY object1_id 
HAVING COUNT(DISTINCT object2_id) = 6 

가장 중요한 것은 비록 당신이 당신의 테이블에 적절한 인덱스을 가지고 있는지 확인하는 것입니다! 이것은 멀리 하나의 쿼리 또는 다른 쓰기 여부보다 더 중요합니다.

+0

많은 도움을 주셔서 감사합니다. 내 쿼리 복잡성 때문에 O (N)과 이제는 O (1) (왜냐하면 두 개 이상의 객체가 교차하기 때문입니다) 때문에 쿼리는 실제로 원하는대로 optmized됩니다. 다시 고마워요 –

1

나는 이것이 작동해야한다고 생각합니다. 또한 일치하는 구성 2가있는 모든 구성 1을 찾습니다. 내가 당신이 찾고있는 것을 오해하고있는 것이 아니라면. 그렇다면 샘플 데이터를 제공 할 수 있습니까?

SELECT c1.object_id 
FROM Composition AS c1 
WHERE EXISTS 
    (
     SELECT 1 
     FROM Composition c2 
     WHERE c2.object2_id = c1.object1_id 
     --Add an AND to only look for a certain set of c2's 
     --AND c2.object2_id IN (SET of object2id's) 
    ) 
+0

예제와 예제를 추가했는데 쿼리가 제 경우에는 작동하지 않는다고 생각합니다. object2_id == object1_id가 필요 없습니다. –

0

나는 이것이 relational division 질문이라고 생각합니다.

유추 : 모든 부품을 공급하는 공급자를 찾으십시오.

object2_id

part_id{ 1, 2, 3 } 세트에있는 모든 부품을 공급 공급 업체 supplier_id 값을 찾아 part_id

object1_idsupplier_id

쿼리는입니다.

이 보통으로 규정되고,

... 적어도 한 부분과 ... 공급 업체

그렇지 않으면 모든 공급 업체가 부품의 빈 세트를 제공 할 것입니다.

+0

이 답변을 하향 투표 한 사람은 문제를 해결할 수 없다는 관계 구분의 증거를 게시 할 수 있습니까? 허용 된 대답은 나에게 고전적인 구분 패턴처럼 보이지만 제수 세트의 카디널리티에 대한 하드 코딩 된 값, 즉 확장되지 않습니다. 고마워;) – onedaywhen

+0

정답이지만, 컨셉의 이름을 정하고 링크를 제공하면 대개이 분야에서 많은 도움이되지 않습니다. 어쩌면 그것이 이유 였을 것입니다. –

+0

@ErwinSmout : 맞습니다. – onedaywhen

관련 문제