2014-04-17 4 views
0

2 개의 테이블이 있다고 가정 해 봅시다.SQL 조건부 내부 조인

Nav: 
----------- 
id INT NOT NULL, 
title VARCHAR(50) NOT NULL, 
target_page INT DEFAULT NULL; 

Pages: 
----------- 
id INT NOT NULL, 
url VARCHAR(200) NOT NULL, 
access_level INT NOT NULL; 

Nav의 target_page는 NULL 일 수 있습니다. 나는 내부를 사용할 수있는 탐색에서 데이터를 선택하는 동안 페이지에서 URL를 얻기 위해 원하는 경우 가입 : 시스템의 현재 사용자 말

그래서
SELECT Nav.id, Nav.title, Pages.url FROM Nav 
INNER JOIN Pages ON Pages.id = Nav.target_page 

내가 추가 조건을 추가하려면이 만 볼 수 있습니다 이너 가입

SELECT Nav.id, Nav.title, Pages.url FROM Nav 
INNER JOIN Pages ON Pages.id = Nav.target_page 
WHERE Pages.access_level <= OurImaginaryUserLevel 

사용자가 행 ACCESS_LEVEL는 사용자의보다 큰의 페이지에 기록에 연결되어 탐색에서 반환하지 않는 것을 보장 : 페이지 그들은 내가 추가 조건을 추가 할 수 있습니다에 액세스 할 수 있습니다.

그러나 Nav의 일부 레코드에는 NULL의 target_page가 있습니다. INNER JOIN이 ID가 NULL 인 페이지에 레코드가 없으므로 INNER JOIN이 반환하지 못하도록하더라도이 레코드를 반환하고 싶습니다.

NULL의 target_page가있는 레코드 만 INNER JOIN에서 제외됩니다. Pages 테이블에 일치하는 것이 있고 Pages.access_level 조건이 충족되는 경우에만 NULL이 아닌 target_page 레코드가 반환되어야하므로 왼쪽 결합을 사용할 수 없습니다.

나의 요구 사항을 이해하기 어려운 경우 사과드립니다. 더 이상 질문하지 마십시오.

답변

2

사전 당신이 LEFT JOIN 오해가 있다고 생각에서

감사합니다 - 귀하의 경우, 당신은 LEFT JOININNER JOIN를 교체하고 똑같은 결과를 얻을 수 있습니다! 당신이 원하는 것을 달성하기 위해

, 당신은 실제로 당신도이 target_page이없는 Nav에서 행을 검색 할 좋아하기 때문에, 그것을 사용해야합니다

SELECT Nav.id, Nav.title, Pages.url FROM Nav 
LEFT JOIN Pages ON Pages.id = Nav.target_page 
WHERE Pages.access_level <= 1 OR target_page IS NULL 

데모 : http://sqlfiddle.com/#!2/69ed06/1

보시다시피 레벨 1 페이지의 nav와 페이지 연관이없는 nav 모두를 반환합니다.

+0

멋지다 훌륭합니다! Left Join을 사용하면 WHERE 절에 조건을 넣든 ON 절 뒤에 조건을 넣든 상관 없습니다. 고마워요! –

+0

도움이 될 수있어서 기쁩니다. :) –