2013-06-15 3 views
0

두 개의 PublicSettings 및 PrivateSettings 테이블이 있습니다. PublicSettings는 다른 유형의 사용자에 대한 모든 기본 설정을 가지며 PrivateSettings는 기본 설정과 다른 값을 갖는 사용자 특정 설정 만 유지합니다. 사용자에 대한 모든 설정을 읽으려고하지만 개인 설정에있는 설정이이 테이블에서 가져온 값이 아니라면 공용 테이블에서 값을 가져옵니다.SQL Server : 두 개의 다른 테이블에서 값 선택

select settingname, value from PublicSettings where [email protected] 

이 모든 기본 설정을 선택하지만, 예를 들어 설정 "show_captcha_on_login은"나는 대중 모두 얻으려면 기본적으로 사용하지만 같은 settingname 개인 설정에서 단일 사용자도 마찬가지입니다 것을 상상하지만,이 하나 (개인 설정에서 존재하는) 개인 설정에서.

SELECT 
    pub.name, 
    CASE WHEN (pub.name = priv.name) THEN priv.value ELSE pub.value END AS value 
FROM 
    PublicSettings pub 
    LEFT JOIN PrivateSettings priv ON (pub.utype = priv.utype) 
WHERE 
    priv.[uid]=1 
+0

선택 유착 (T2.A, T1.A) ... 값이 privatesettings 테이블에 널 (null)이고 다른 하나를 선택하면 – JimmyB

+0

유착이 작동 건 그것은 공개 설정보다 다른 값을 가지지 않으면 privatesettings에 레코드가 존재하지 않는다는 것입니다. –

+0

그 이유는 테이블간에 * outer * join을 사용하는 이유입니다 ... – JimmyB

답변

1

을 선택, 너무 USER_ID 열이 제외하는 방식 PrivateSetting에 의해

같은 열 이름을 가지고 사용자 특정 값은 일부 공개 값에 대해서만 존재합니다. 비공개 값이 표시되지 않으면 NULL이 반환되어 반환 할 값을 결정할 수 있습니다.

SELECT pub.settingname, 
     ISNULL(priv.value,pub.value) AS value 
    FROM PublicSettings pub 
    LEFT OUTER JOIN PrivateSettings priv 
    ON pub.settingname = priv.settingname 
    AND priv.userid = @userid 
WHERE [email protected]; 
T1은 외부 음부가 t2에서는 가입 왼쪽 기본값에서
+0

코드에 몇 가지 문제가 있었지만 아이디어가 정확했습니다. 저는 답변을 편집했습니다. 덕분에 –

+0

좋습니다! 변경 사항을 승인했습니다. 'Left join'을 검토하여 PrivateSettings에없는 PublicSettings의 모든 데이터를 가져옵니다. – Mate

1

당신은 외부의 사용을해야하기 때문에 가입 : 그것은이 시도 사용자 별 설정을

+0

모르겠지만 코드를 테스트 한 결과 왼쪽 jion과 완벽하게 작동했습니다. –

+0

예, OUTER 키워드는 다음과 같습니다. LEFT JOIN은 LEFT OUTER JOIN과 동일합니다. – peterk411

관련 문제