2014-04-04 1 views
1

이 질문을 통해 다음과 같이 얻을 수있는 동일한 결과를 얻으려면 몇 가지 대체 방법을 찾아보십시오.MySql : 외부 조인 쿼리 : 가능한 경우에만 다른 테이블의 필드 값으로 필드 값 재정의 일부 대체 더 나은 방법

계정 (사용자), profile_parameters, Account_profile의 세 가지 테이블이 있습니다. 기본적으로 계정 프로필은 기본 시스템 config (profile_parameters)에 정의 된 매개 변수 값을 가져 오지만 사용자는 자신의 기본 설정 (Account_profile이 저장 됨)을 정의하여이 값을 무시할 수 있습니다. 그런 다음이 매개 변수가 기본 시스템 구성보다 우선합니다. 다음은 테이블 구조입니다 :

계정 : Account_id (PK) 좀 더 열 ....

Profile_parameters : prfl_param_id (PK), 이 param_desc, param_default_value가 (이 시스템의 기본이다 구성 값)

Account_profile : account_id (FK 계정으로), prfl_param_id (FK to profile_parameter. param_value (사용자가 정의한 재정의 된 값)

다음 쿼리에서 원하는 결과를 얻을 수 있었지만 확인하려면 하나의 하위 쿼리를 실행하고 다른 하위 쿼리를 가져 오려면 다른 우아한 쿼리를 사용해야합니다. 나는 그다지 편안함을 느끼지 못한다.

SELECT a.account_id,pp.prfl_param_id, 
(CASE WHEN EXISTS (SELECT 1 FROM account_profile ap WHERE ap.account_id=a.account_id AND ap.prfl_param_id=pp.prfl_param_id) 
     THEN (SELECT param_value FROM account_profile ap WHERE ap.account_id=a.account_id AND ap.prfl_param_id=pp.prfl_param_id) 
ELSE pp.default_value END) dfd 
FROM account a, profile_parameters pp 

enter image description here

어떤 제안 ????

답변

2

는 다음과 같이 왼쪽 조인을 사용할 필요가 : 여기

select temp.account_id, temp.prfl_param_id,if(param_value is null,temp.param_default_value,param_value) dfd 
from (
    select a.account_id, pp.prfl_param_id, param_default_value 
    from account a, profile_parameters pp 
) temp left join account_profile ap on temp.account_id=ap.account_id and temp.prfl_param_id=ap.prfl_param_id 

SQLFiddle입니다

+0

이가 (사용자) 계정하는 것은 정의에만 매개 변수를 반환합니다. 사용자가 값을 정의하지 않으면 기본 시스템 구성 값이 반환되지 않습니다. 또한, 어떤 가치도 전혀 정의하지 않은 다른 모든 계정 (사용자)에 대한 기본 시스템 값을 제공하지 않습니다. – FaisalKhan

+0

샘플 데이터와 문제의 예상 출력을 제공하는 것이 더 분명합니다. –

+0

방금 ​​질문을 편집하고 샘플 데이터를 넣었습니다. 명확 해지기를 바랍니다. – FaisalKhan