2014-04-25 2 views
-1

여기 달성하고자하는 것이 있습니다 : 연락처 유형에 따라 사람 또는 회사 이름을 선택하십시오.SELECT * FROM TABLE, TABLE 다른 쿼리에 따라 달라짐 - SQL

테이블 :

CONTACTS :    PEOPLE    FIRMS 
- id      - contact_id  - contact_id  
- type (person/firm)  - name    - name 

나는 마법의이 종류를 좋아하는 것 :

SELECT type 
FROM contacts 
WHERE contacts.id = 42; 

SELECT model.name 
FROM contacts LEFT JOIN model ON model.contact_id = contacts.id 
WHERE contacts_id = 42 
AND model = CASE (WHEN type = "person" THEN "people" 
        WHEN type = "firm" THEN "Firms" END); (Not sure this one works) 

모든 쿼리 일인치 감사 !

+0

뭐가 잘못 되었나요? 샘플 데이터 및 샘플 출력을 제공하십시오. – StevieG

+2

'모델'이란 무엇입니까? 3 개의 테이블이 있고 SQL에서 다른 테이블을 사용한다고하셨습니다. –

+0

하하, * 모델 * 나도 혼란스러워. 유형에 따라 테이블 직원 또는 회사로 대체되는 일종의 변수라고 가정합니다. 때때로 의사 코드를 읽는 것이 어렵습니다 :-) –

답변

0

을; 그 중 하나는 id와 type을 일치시킵니다. 그런 다음 COALESCE를 사용하여 찾은 이름을 표시하십시오.

select coalesce(p.name, f.name) as name 
from contacts c 
left join people p on p.contacts_id = c.id and c.type = 'person' 
left join firms f on f.contacts_id = c.id and c.type = 'firm' 
where c.id = 42; 
+0

정확히 내가 필요한 것입니다. 감사합니다! – user2688870

1

다음과 같이 두 테이블을 결합한 다음 contacts.type에 따라 사용할 열을 결정할 수 있습니다.

SELECT 
    (CASE WHEN t1.type = 'person' THEN t2.name WHEN t1.type = 'firm' THEN t3.name) AS contact_name 
FROM contacts t1 
LEFT JOIN people t2 ON t1.id = t2.contact_id 
LEFT JOIN firms t3 ON t1.id = t3.contact_id 
0

이 같은 동적 SQL을 사용할 수 있습니다 : 간단하게 두 테이블을 조인 왼쪽

declare 
    @table_name nvarchar(20), 
    @query nvarchar(max) 

SELECT 
    @table_name = 
        case type 
         when 'person' then 'people' 
         when 'firm' then 'firms' 
        end 
FROM contacts 
WHERE contacts.id = 42; 


set @query = N'SELECT ' + @table_name + '.name ' + 
       'FROM contacts LEFT JOIN model ON ' + @table_name + '.contact_id = contacts.id 
       WHERE contacts_id = 42 ' 

exec sp_executesql @query 
0

여기 않고 다른 방법 인 조인 문제를 해결하는 방법에는 여러 가지가

select 
    case when c.type = 'person' then 
    (select name from people p where p.contacts_id = c.id) 
    else 
    (select name from firms f on f.contacts_id = c.id) 
    end as name 
from contacts c 
where c.id = 42; 

당신은 참조하십시오. 가장 가독성이 높은 것을 선택하십시오.

+0

항상 읽을 수있는 것은 아닙니다. 실적을 고려해야합니다. 당신은 2의 설명 계획을보고 그것들을 비교함으로써 그것을 할 수 있습니다. – TheOneWhoPrograms

+0

나는 보통 가독성을 우선 고려해야한다. 성능 문제가 발생할 때 성능 최적화가 중요합니다. ID로 단일 레코드를 찾을 때 발생할 가능성이없는 :-) –

관련 문제