2010-05-10 1 views
2

내가 세 개의 테이블는 왼쪽

을 연관 표에 가입

전망은 - 전망에 대한 전망 정보를

id | name | projectID 
1 | p1 | 1 
2 | p2 | 1 
3 | p3 | 1 
4 | p4 | 2 
5 | p5 | 2 
6 | p6 | 2 

공동을

id 
name 
projectID 

샘플 데이터를 보유 - 컨 조인트 정보를 보유

id 
title 
projectID 

샘프 르 데이터

공동 잠재 값 보유 연관 테이블있다
id | title | projectID 
1 | color | 1 
2 | size | 1 
3 | qual | 1 
4 | color | 2 
5 | price | 2 
6 | weight | 2 

:

ConjointProspect 
id 
prospectID 
conjointID 
value 

샘플 데이터

id | prospectID | conjointID | value 
1 |  1  |  1  | 20 
2 |  1  |  2  | 30 
3 |  1  |  3  | 50 
4 |  2  |  1  | 10 
5 |  2  |  3  | 40 

하나 개 이상의 잠재 하나 이상의 conjoints있다 그들의 각각의 테이블에. 잠재 고객은 각 결합에 대해 가치가 있거나 없을 수 있습니다.

주어진 프로젝트의 각 잠재 고객에 대해 모든 결합 값을 추출하고 주어진 결합에 대해 ConjointProspect 테이블에없는 값에 대한 값이없는 경우 NULL을 표시하는 SQL 문을 갖고 싶습니다. 전망. ConjointProspect에 projectID이의 라인을 따라

뭔가 1

prospectID | conjoint ID | value 
    1  |  1  | 20 
    1  |  2  | 30 
    1  |  3  | 50 
    2  |  1  | 10 
    2  |  2  | NULL 
    2  |  3  | 40 
    3  |  1  | NULL 
    3  |  2  | NULL 
    3  |  3  | NULL 

나는 내부의 전망과 컨 조인트 테이블 후 왼쪽 조인을 사용 해봤 가입 =하지만 어딘가에 나는군요 (나에게) 이해가되지 않는 전망/공동 쌍에 대한 카티 제품

SELECT p.id, p.name, c.id, c.title, cp.value 
FROM prospect p 
INNER JOIN conjoint c ON p.projectID = c.projectid 
LEFT JOIN conjointProspect cp ON cp.prospectID = p.id 
WHERE p.projectID = 2 
ORDER BY p.id, c.id 

prospectID | conjoint ID | value 
    1  |  1  | 20 
    1  |  2  | 30 
    1  |  3  | 50 
    1  |  1  | 20 
    1  |  2  | 30 
    1  |  3  | 50 
    1  |  1  | 20 
    1  |  2  | 30 
    1  |  3  | 50 
    2  |  1  | 10 
    2  |  2  | 40 
    2  |  1  | 10 
    2  |  2  | 40 
    2  |  1  | 10 
    2  |  2  | 40 
    3  |  1  | NULL 
    3  |  2  | NULL 
    3  |  3  | NULL 

안내는 대단히 감사하겠습니다 !!

+1

귀하의 결합 표 샘플 ... 첫 번째 열에는 모두 1이 있습니다 ... 대신이 순서가 1-6이라는 의미였습니까? – DRapp

+0

DRapp - 예, 했어요. 그 점을 지적 해 주셔서 감사합니다. 샘플 데이터를 편집했습니다. – TomH

답변

2

다음은이 작업을 수행 할 것입니다 ... 첫 번째 FROM 테이블로 선택을 통해 해당 프로젝트 내의 모든 잠재 고객과 요소에 대해 데카르트를 미리 결합하십시오. 그런 다음 conjoinprospect에 왼쪽으로 결합하십시오. 분명히 결과에서 특정 열을 변경/제거 할 수 있지만 적어도 모든 것은 거기에 있습니다. 기대하는 정확한 결과로 원하는 결합에 ...

SELECT 
     PJ.*, 
     CJP.Value 
    FROM 
     ( SELECT 
        P.ID ProspectID, 
        P.Name, 
        P.ProjectID, 
        CJ.Title, 
        CJ.ID ConJointID 
       FROM 
        Prospect P, 
        ConJoint CJ 
       where 
         P.ProjectID = 1 
        AND P.ProjectID = CJ.ProjectID 
       ORDER BY 
        1, 4 
     ) PJ 
     LEFT JOIN conjointProspect cjp 
      ON PJ.ProspectID = cjp.prospectID 
      AND PJ.ConjointID = cjp.conjointid 
    ORDER BY 
     PJ.ProspectID, 
     PJ.ConJointID 
+0

우수! 광고 된대로 작동합니다. 나는 ON 절에 하나 이상의 조건이있을 수 있다는 것을 알지 못했습니다. 그렇다면 prospect와 conjoint에서 내부 조인을 사용하여 원하는 레코드를 추출한 다음 솔루션에서 사용한 것과 동일한 ON 절을 사용하여 conjointprospect에 왼쪽으로 결합 할 수 있습니다. "p.id prospectID, p.name의 ProspectName을 선택 conjointID는 잠재 P INNER로부터, conjointTitle c.title, cp.value 을 c.id 가입 공동 C = ON p.projectID c.projectID LEFT CP ON conjointprospect의 CP 가입 .conjointID = c.id AND cp.prospectID = p.id WHERE p.projectID = 2 ORDER BY p.id " 감사합니다. DRapp !! – TomH

0

귀하의 데카르트 제품은 프로젝트 ID로 합류 한 결과입니다 - 샘플 데이터에는 프로젝트 ID가 1 인 프로젝트 ID가 1과 3 인 3 개의 잠재 고객이 있습니다. 프로젝트 ID를 기반으로 가입하면 9 당신이 얻고있는 데이터 행. 잠재 고객과 공동 고객 간의 매핑을 보유하고있는 것으로서 conjointprospects 테이블을 통해 실제로 참여해야하는 것처럼 보입니다.

무엇을하기를 같은 시도하는 경우 : 문제가 해결됩니다

SELECT p.id, p.name, c.id, c.title, cp.value 
FROM prospect p 
LEFT JOIN conjointProspect cp ON cp.prospectID = p.id 
RIGHT JOIN conjoint c ON cp.conjointID = c.id 
WHERE p.projectID = 2 
ORDER BY p.id, c.id 

확실하지 않음 경우, 그러나 conjointprospects가 제대로 conjoints에 대한 전망을지도하기 위해 사용자 참여의 중심에 있어야처럼 보인다.

+0

감사합니다. Ryan - 저는 같은 생각을했습니다. ConjointProspect 테이블을 "중간"에 두었습니다. 귀하의 제안을 시도했지만 불행히도 ConjointProspect 테이블에있는 행만 반환합니다. "SELECT p.id prospectID, p.name, c.id conjointID, c.title, cp.value FROM 잠재 고객 p, 결합점 c, 결합 지점 cp WHERE c.id = cp와 동일합니다. conjointID AND p.id = cp.prospectID AND p.projectID = 2 ORDER BY p.id, c.id " 답변을 주셔서 감사합니다. – TomH