2011-03-02 7 views
-1

조인이 특정 결과 집합을 찾는 방법을 시각화하는 데 어려움을 겪고 있습니다.SQL : 세 개의 테이블 조인 - 내부/외부 조인 결합?

나는 프로젝트, 권장 사항, 서비스라는 세 개의 테이블을 가지고 있습니다. 권장 사항은 프로젝트와 서비스 간의 조인 테이블 일뿐입니다. 즉, 프로젝트는 0 개 이상의 권장 서비스를 가질 수 있습니다. 그 관계를 포착하기 위해 Recommendations 테이블에는 각 권장 레코드에 대한 project_id 및 service_id가 있습니다.

그래서, 관련 필드 :

Projects.id | Recommendations.project_id | Recommendations.service_id | Services.id 

나는 특정 서비스에 대한 추천이 없습니다있는 모든 프로젝트의 목록을 끌어 노력하고있어. 나는 전혀 권고가없는 한 모든 프로젝트를 가져옵니다 다음을 가지고, 즉 :

SELECT * from projects P 
LEFT OUTER JOIN Recommendations R ON P.id = R.project_id 
WHERE R.project_id IS NULL 

가 나는뿐만 아니라 서비스 테이블에 가입해야합니다 알고,하지만 난 모르겠어요 어떻게을 그것을 구조화해야합니다. 모든 팁을 부탁드립니다.

SELECT * FROM projects WHERE NOT EXISTS (SELECT * FROM recommendations WHERE project_id=projects.id AND recommendations.service_id=10) 
+0

'추천'테이블 이외의 '프로젝트'와 '서비스'간에는 아무런 관계가 없습니까? –

+0

맞습니다. – David

답변

2
SELECT P.* from projects P 
LEFT JOIN Recommendations R 
    ON P.id = R.project_id 
LEFT JOIN Services S 
    ON S.Service_id = R.service_id and s.ID = 10 
WHERE s.service_id is null 

이 서비스 ID가없는 레코드를 찾을 수 있어야는 절 R.project_id가 어디 꺼내서 10 주 :

+2

+1 :하지만 '서비스'테이블에 가입 할 필요조차 없습니다. 그냥 '... LEFT JOIN 권장 사항 R ON P.id = R.project_id 및 R.service_id = 10 WHERE R.service_id가 NULL'' –

+0

감사합니다. 그래도 S.service_id는 없습니다. 각 테이블의 키는 단순히 'id'입니다. 나는 이것으로 팅커 칠할 것이다. 입력하기가 더 짧았 기 때문에 질문의 목적으로 만 * 선택했습니다. 실제로 앱에있는 모든 것을 다시 가져 오지 않습니다. – David

+0

@ Joe Stefanelli, 나는 네가 옳다고 생각한다. – HLGEM

2

하나의 옵션은 가입하지 않고, 하위 쿼리 접근 방식 없는. 또한 하위 쿼리 방식 사용 (빠른 될 가능성이 있지만, 모두를 테스트합니다.) 수는 * 지금까지 사용을 선택하고 싶지 않아요 실제 생활에서 물론

SELECT * 
FROM projects 
WHERE NOT EXISTS (SELECT * 
        FROM recommendations R 
        JOIN Services S 
         ON S.Service_id = R.service_id 
        WHERE project_id=projects.id and s.ID = 10) 

. 선택 부분에 원하는 실제 필드를 입력하십시오.

+0

답장을 보내 주셔서 감사합니다. 이것은 내 게시물의 쿼리와 동일한 결과를 반환합니다. 즉, 모든 서비스에 대한 권장 사항이없는 모든 프로젝트가 표시됩니다. 내가하려는 것은 특정 서비스에 대한 권장 사항이없는 프로젝트 목록을 얻는 것입니다. 즉, 해당 프로젝트에 대한 다른 권장 사항이있을 수 있습니다. – David

+0

너무 빨리 읽지 않아서 죄송합니다. 아래의 @ HLGEM의 솔루션은 꽤 좋은 것처럼 보입니다. 서비스 테이블에 대한 조인은 실제로 불필요한 것처럼 보입니다. 기본적으로 위의 하위 쿼리 제안에 "AND recommendations.service_id = 10"을 추가하고 있습니다. –