2014-10-08 2 views
0

다음 표가 있습니다. 이들은 실제 테이블이 아니지만 개념은 여기에 있습니다.다른 테이블과 열거 형 테이블을 동적으로 결합하십시오.

Table1 
---------------------------------- 
FieldID|EnumeratedValue|TextValue 
---------------------------------- 
Col1 |1    |Hey 
---------------------------------- 
Col1 |2    |Test 
---------------------------------- 
Col1 |3    |George 
---------------------------------- 
Col2 |1    |Random 
---------------------------------- 
Col2 |2    |Wesley 
---------------------------------- 
Col3 |1    |Tompson 
---------------------------------- 
Col3 |2    |Oooo 
---------------------------------- 
Table2 
---------------------------------- 
Col1 |Col2   |Col3 
---------------------------------- 
1  |2    |1 
---------------------------------- 
2  |1    |1 
---------------------------------- 
3  |1    |2 
---------------------------------- 

원하는 결과가

---------------------------------- 
Col1 |Col2   |Col3 
---------------------------------- 
Hey  |Wesley   |Tompson 
---------------------------------- 
Test |Random   |Tompson 
---------------------------------- 
George |Random   |Oooo 
---------------------------------- 

그래서 당신이

SELECT col1.TextValue,col2.TextValue,col3.TextValue 
    FROM Table2 t2, 
(SELECT * FROM Table1 WHERE FieldID = 'Col1') col1, 
(SELECT * FROM Table1 WHERE FieldID = 'Col2') col2, 
(SELECT * FROM Table1 WHERE FieldID = 'Col3') col3 
    WHERE t2.col1 = col1.EnumeratedValue and t2.col2 = col2.EnumeratedValue and t2.col3 = col3.EnumeratedValue 

문제 같은 것을 쓸 수있는보기 것이다 것은 그가 우리의 실제 테이블 ~ 테이블 당이 열 (20) . 이 코드를 작성하는 더 간단한 방법을 찾고 싶습니다. 내가 만드는 각보기에 대해 20 개의 조인을 하드 코딩하지 않으려합니다. 대안이 있는지 알려주세요.

+0

나는 그것을 얻지 않는다. 나는 조인이 무엇을하는지 보았습니다.하지만 전혀 이해가되지 않습니다. 좀 더 명확히하십시오. 그리고 t2.col1 (숫자)과 col1.FieldId (텍스트)를 비교할 수 없습니다. 결과가 없습니다. 원하는 결과물을 볼 때 당신이하고 싶은 것을 이해하지만 그 이유를 이해하지 못합니다. – Juru

+1

주미 죄송합니다. 내 논리가 잘못되었습니다. 쿼리를 업데이트했습니다. 희망은 모든 것을 하드 코딩 할 필요가 없다는 것입니다 (SELECT * FROM 표 1 ...). –

+0

@ 주니어 우리 테이블에 스토리지를 저장하기 위해 enum 테이블을 사용하고 있습니다. 잉여 문자열은 우리가 감당할 수없는 많은 공간을 낭비 할 것이므로 나머지 테이블에서는 EnumeratedTypes (ints)를 사용합니다. –

답변

3

모든 가변 조인 솔루션 에서처럼 동적 피벗이 실제로 이것을 보는 더 좋은 방법입니다. 하드 코드 된 피벗 솔루션과 같은 성능은 아니지만 최소한의 개발 시간을 필요로하며 테이블 값 함수 (테이블 이름을 제공 할 수있는 아마도 컬럼 이름

으로) 회동 및 가입 데모 데이터 설정 :

if object_id('dbo.test_enum') is not null drop table dbo.test_enum 
create table dbo.test_enum (
     FieldID sysname 
    , EnumeratedValue int not null 
    , TextValue sysname 
    , primary key (FieldID, EnumeratedValue) 
) 
INSERT INTO dbo.test_enum 
    (FieldID, EnumeratedValue, TextValue) 
VALUES 
    ('Col1', 1, 'Hey'), 
    ('Col1', 2, 'Test'), 
    ('Col1', 3, 'George'), 
    ('Col2', 1, 'Random'), 
    ('Col2', 2, 'Wesley'), 
    ('Col3', 1, 'Tompson'), 
    ('Col3', 2, 'Oooo') 
; 
if object_id('dbo.test_table') is not null drop table dbo.test_table 
create table test_table (
     id int primary key identity(1,1) 
    , Col1 int not null 
    , Col2 int not null 
    , Col3 int not null 
); 
INSERT INTO dbo.test_table 
    (Col1, Col2, Col3) 
VALUES 
    (1,2,1), 
    (2,1,1), 
    (3,1,2) 

다음 동적 선택 부이다 자체에

declare @cols nvarchar(max) = (select stuff((
    select ',' + quotename(c.name) 
    from sys.objects o 
     inner join sys.columns c on c.object_id = o.object_id 
    where o.name = 'test_table' 
     and c.name in ('Col1', 'Col2', 'Col3') 
    for xml path ('') 
    ),1,1,'')) 
declare @SQL nvarchar(max) = N' 
select p.id, ' + @cols + ' 
from (
    select unp.id, unp.FieldID, e.TextValue 
    from dbo.test_table 
     unpivot (
      EnumeratedValues FOR FieldID IN (' + @cols + ') 
     ) unp 
     inner join dbo.test_enum e on e.EnumeratedValue = unp.EnumeratedValues 
      and e.FieldID = unp.FieldID 
    ) z 
    pivot (
     min(z.TextValue) FOR z.FieldID IN (' + @cols + ') 
    ) p 
' 
exec sp_executesql @sql 

이 결과 집합을 반환 질문에서 바라지 만,보기를 되돌리기 위해 적용될 수있다. 주어진 테이블/컬럼 데이터 세트의 정의를 작성한 다음 테이블/뷰별로 추가로 적용합니다.

+0

환상적인 Jaaz! 이 예제를 작성해 주셔서 감사합니다! –

관련 문제