2016-11-28 11 views
2

세부 테이블에서 값을받는 (잠재적으로 여러 개의) 열이있는 단일 테이블을 가져와야합니다. 자세한 표는 기본적으로 이러한 열이 있습니다세부 테이블 항목을 마스터 테이블의 열로 선택하는 방법은 무엇입니까?

DetailID, 
MasterID (foreign key to master ID), 
DetailName (nvarchar()), 
DetailValue (nvarchar()) 

지금까지 내가 사용하여 성공 :

SELECT Master.ID, 
    (SELECT DetailValue FROM Detail WHERE Master.ID=Detail.MasterID AND DetailName='Name1') as Detail1, 
    (SELECT DetailValue FROM Detail WHERE Master.ID=Detail.MasterID AND DetailName='Name2') as Detail2 
FROM Master 

을하지만 자세한 내용을 추가 할 때이 매우 심하게 확장 할 수 있습니다.

효과적인 방법은 무엇입니까? DetailNames가 알려진 경우

+1

을 [** 동적 피벗 **] (HTTP : // 유래. com/questions/10404348/sql-server-dynamic-pivot-query) –

+1

[eav] (https://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model) 결국, 패턴 : –

+0

링크를 가져 주셔서 감사합니다; 지금까지이 이름으로이 패턴을 알지 못했습니다. 이 부분은 전체 데이터 모델이 아니라 비즈니스 오브젝트에 임의의 추가 정보를 추가 할 수있는 부분이므로 잠재적 인 부작용이 계속 발생한다고 생각합니다. – Mav

답변

0

, 당신은 조건부 집계 사용할 수 있습니다 : 나는 당신이 여기 문제에 대한 도움을 찾을 수 있다고 생각

SELECT m.ID, 
     MAX(CASE WHEN d.DetailName='Name1' THEN d.DetailValue END) as detail1, 
     MAX(CASE WHEN d.DetailName='Name2' THEN d.DetailValue END) as detail2, 
     ... 
FROM Master m 
JOIN Detail d 
ON m.ID=d.MasterID 
GROUP BY m.ID 
+0

대단히 고맙습니다. 세부 값이 숫자가 아니기 때문에 MAX()를 고려하지 않았지만 잘 작동합니다! – Mav