2012-10-09 2 views
2

키 - 값 쌍의 값을 지정하는 다른 테이블에 연결되는 테이블이 있습니다. 그런 다음 값 테이블은 이름 (키)이있는 테이블로 연결됩니다. 테이블은 다음과 같이 (충분히 근처) 정의 :SQL 저장 동적 데이터

--------------- 
Entity 
--------------- 
EntityID 
Name 
Some other data 

--------------- 
Value 
---------------- 
ValueID 
EntityID 
Value 

--------------- 
Key 
--------------- 
KeyID 
ValueID 
Name 

각 엔티티는 여러 값을 가질 수 있으며 각 값은 하나의 키가 있습니다. 각 엔티티는 동일한 수의 값을 가질 수 없습니다. 기본적으로이 구조는 Entity 테이블을 수정하지 않고 테이블 행을 동적으로 추가 할 수있게 해줍니다.

나는 동적 구조가 내가 할 수있는 SQL에서 사용할 수 있습니까 열 머리글로 Key.Name 필드를 사용하고 해당 Value.Values ​​

을 표시 엔터티 테이블에 *는 선택을하고 싶어 Entity의 각 행에 삽입 한 다음 select?

나는 이것이 의미가 있기를 바랍니다.

+0

이 유형의 동적 작동은 시스템에 따라 매우 다릅니다. 어떤 종류의 데이터베이스를 사용하고 있습니까? 또한 SQL 내에서이 작업을 수행하도록 제한 되었습니까? 아니면 SQL을 호출하는 외부 언어를 사용할 수 있습니까? 후자는 이것을 훨씬 쉽게 만듭니다. – dan1111

+0

SQL 서버 2008 r2. – Jay

+0

는 이론적으로 멋지게 보인다. 실제로는 전혀 좋지 않다. – Randy

답변

5

설명에 따르면 데이터가 PIVOT 인 것처럼 보입니다. PIVOT에는 변환 할 열을 코딩하는 정적 피벗 또는 실행시 열을 결정하는 동적 피벗이 있습니다.

정적 피벗 :

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(name) 
        from [key] 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT entityid, EntityName, ' + @cols + ' from 
      (
       select e.entityid, v.value, 
        e.name EntityName, k.name KeyName 
       from value v 
       left join entity e 
        on v.entityid = e.entityid 
       left join [key] k 
        on v.valueid = k.valueid 
      ) x 
      pivot 
      (
       max(value) 
       for KeyName in (' + @cols + ') 
      ) p ' 

execute(@query) 

이 모두 배치 할 수 SQL Fiddle With Demo

를 참조하십시오

select * 
from 
(
    select e.entityid, v.value, 
    e.name EntityName, k.name KeyName 
    from value v 
    left join entity e 
    on v.entityid = e.entityid 
    left join [key] k 
    on v.valueid = k.valueid 
) x 
pivot 
(
    max(value) 
    for KeyName in ([name 1], [name 2], [name 3], [name 4], [name 5]) 
) p; 

SQL Fiddle With Demo

를 참조

다이내믹 피벗 런타임에 열을 결정 저장 프로 시저에서. 테이블마다 샘플 데이터를 게시 한 다음 원하는 결과를 게시하면 적절한 쿼리를 결정하는 것이 더 쉬울 것입니다.

+0

예제를 수정하여 내 DB에서 작동하도록했습니다. 많은 도움에 감사드립니다! – Jay

+0

@Jay 당신이 일하게되어 기쁩니다. – Taryn