SQL은

2017-04-25 12 views
0

나는이처럼 보이는 EAV 테이블을 설계 특성SQL은

,536,913,632 : 속성 테이블에 연결, 첫 번째 테이블에 피벗을 사용한 후

AttributeID AttributeName 
    1   Hobbies 
    2   Name 
    3   Gender 
    4   IrisColor 

: 속성을지도로

SubjectID Hobbies Name Gender IrisColor 
    1  1  1  2  3 
거의 정확

하지만, (취미입니다) SubjectAttribute 1은 첫 번째 테이블에 한 번 더 나타납니다 (SubjectDetails), 그래서 내가 무엇을 달성하고자하는 것은 이것이다 :

SELECT 
    SubjectID, 
    Hobbies, 
    Name, 
    Gender, 
    IrisColor  
FROM 
(
SELECT SubjectID, attr.AttributeName as attribute, ValueID from SubjectDetails, SubjectAttributes as attr WHERE SubjectDetails.AttributeID=attr.ID 
) as t 
PIVOT(
MAX(ValueID) 

FOR attribute IN (Hobbies,Name,Gender,IrisColor)) AS t1 

WHERE SubjectID=1 

10 나는이 얻을 :

SubjectID Hobbies Name Gender IrisColor 
    1  **1,2**  1  2  3 

나는 분리기를 사용하는 것에 대해 걱정하지 않는다 언급해야하고 나는 그것이있는 물건 기능을하지만 통증이 PIVOT 물건을 결합하는 것을 일을 시도했습니다 (또는 모르겠어 어떻게) .. 어떤 제안? 이 일을해야

+0

을 사용할 필요를 생각하지 질문. –

+0

필자는 그렇게 할 수 없습니다. 반복되는 경우에도 각 속성에 대해 별도의 행을 갖는 것이 요구 사항입니다. 나는보기에서 그것을하는 것을 wan't 만, 그러나 쉼표 간격으로 저장에서 것과 같이 아닙니다 – berthos

답변

1

, 나는 다음과 같은 한 : 은 temporary tableSID 당 하나의 행으로 당신의 EAV 테이블 (table1)의 정보를 저장 (당신은 대신 view를 만들 수 있습니다).

enter image description here

전체 작업 버전 here을 확인하십시오 :이 결과를 가지고

SELECT * 
FROM 
    (
    SELECT * from #temptbl 
) as t 
PIVOT(MAX(vid) FOR attrname IN (Hobbies,Name,Gender,IrisColor)) AS t1 
WHERE sid=1 

: 그런 다음 (당신의 피벗 쿼리를 사용하여) 다음과 같이 그 결과 집합을 선회.

는 는
+0

그것은 작동한다! 고맙습니다! – berthos

+0

매우 좋습니다! :) 행복한 코딩! –

+0

또 하나의 질문입니다. 매번 테이블을 만들거나 다시 만들 때 가장 좋은 방법은 무엇입니까? – berthos

0
이는 PIVOT을 사용하지 않고 작동합니다

, 나는 여기 피봇을 사용하여 피벗 다음 쉼표로 구분 된 값을 갖는 속성 당 하나 개의 행을 가지고 있으며, 그래서 당신은 당신의 소스 EAV 테이블을 수정할 수 있습니다 PIVOT에게

SELECT SubjectID 
     ,+STUFF((SELECT ', '+CAST(ValueID AS NVARCHAR) 
       FROM @T_SubjectAttributes A 
       INNER JOIN @T_SubjectDetails B ON A.AttributeID = B.AttributeId 
       WHERE AttributeName = 'Hobbies' 
       AND B.SubjectID = H.SubjectID FOR XML PATH('')) 
         ,1,2,'') AS Hobbies 
     ,STUFF((SELECT ', '+CAST(ValueID AS NVARCHAR) 
       FROM @T_SubjectAttributes A 
       INNER JOIN @T_SubjectDetails B ON A.AttributeID = B.AttributeId 
       WHERE AttributeName = 'Name' 
       AND B.SubjectID = H.SubjectID FOR XML PATH('')) 
         ,1,2,'') AS Name 
     ,STUFF((SELECT ', '+CAST(ValueID AS NVARCHAR) 
       FROM @T_SubjectAttributes A 
       INNER JOIN @T_SubjectDetails B ON A.AttributeID = B.AttributeId 
       WHERE AttributeName = 'Gender' 
       AND B.SubjectID = H.SubjectID FOR XML PATH('')) 
         ,1,2,'') AS Gender 
     ,STUFF((SELECT ', '+CAST(ValueID AS NVARCHAR) 
       FROM @T_SubjectAttributes A 
       INNER JOIN @T_SubjectDetails B ON A.AttributeID = B.AttributeId 
       WHERE AttributeName = 'IrisColor' 
       AND B.SubjectID = H.SubjectID FOR XML PATH('')) 
         ,1,2,'') AS IrisColor 
FROM @T_SubjectDetails H 
GROUP BY SubjectID