Значение сводного ключа SQL Server 2008 для присоединенного родителя? - PullRequest
0 голосов
/ 20 мая 2011

SQL Server 2008, у меня есть следующие схемы и строки родительской / дочерней таблицы:

   create table #par( parid int primary key identity(1,1) , partext varchar(6) )
create table #chi( chiid int primary key identity(1,1) , parid int null , chirefid int null , chiinfo varchar(6) )
create table #chiref ( chirefid int primary key identity(1,1) , chisubdesc varchar(9) )

insert into #par values ( 'par1' ) , ('par2')

insert into #chiref values ( 'chi1' )
insert into #chiref values ( 'chi2' )
insert into #chiref values ( 'chi3' )

insert into #chi values ( 1 , 1 , 'aaa' )
insert into #chi values ( 1 , 2 , 'bbb' )
insert into #chi values ( 2 , 1 , 'ccc' )
insert into #chi values ( 2 , 2 , 'ddd' )
insert into #chi values ( 2 , 3 , 'eee' ) 

Дочерний элемент #chi содержит только пары ключ / значение, и мне нужно преобразовать текст (ключ) в столбец и поместить значение внутрь, чтобы результирующий набор имел форму, подобную приведенной ниже. Каков наилучший способ сделать это (я не могу изменить ключ / значение, он унаследован от другой системы). И в таблице #chiref есть соединение для фактических имен столбцов (что действительно убивает меня).

partext     chi1     chi2     chi3
par1        aaa      bbb
par2        ccc      ddd      eee

Спасибо.

РЕДАКТИРОВАТЬ - Важно помнить, что имена столбцов должны соответствовать «значению ключа» в таблице. Таким образом, если ключ строки EAV - "chi1", то у стержня должен быть "chi1". У меня была просто «1», которая сломалась. Итак, я понял.

Еще раз спасибо!

1 Ответ

2 голосов
/ 20 мая 2011
select partext, [chi1], [chi2], [chi3]
from
(
    select p.partext, c.chitext, c.chiinfo
    from #chi c
        join #par p
            on c.parid = p.parid
) AS SourceTable
pivot
(
    min(chiinfo)
    for chitext in ([chi1], [chi2], [chi3])
) as PivotTable

или этот немного более эффективен, хотя больше кода:

with c
as
(
    select parid, [chi1], [chi2], [chi3]
    from
    (
        select parid, chitext, chiinfo
        from #chi
    ) AS SourceTable
    pivot
    (
        min(chiinfo)
        for chitext in ([chi1], [chi2], [chi3])
    ) as PivotTable
)
select p.partext, c.*
from c
join #par p
    on c.parid = p.parid

если вам нужен динамический номер столбца, вы можете сделать динамический запрос:

declare @ColumnList varchar(max) 

select @ColumnList = isnull(@columnList + ', ', '') + '[' + chitext + ']'
from
(
    select distinct chitext
    from #chi
) tt
order by chitext

declare @Command varchar(max) = '
    with c
    as
    (
        select parid, ' + @ColumnList + '
        from
        (
            select parid, chitext, chiinfo
            from #chi
        ) AS SourceTable
        pivot
        (
            min(chiinfo)
            for chitext in (' + @ColumnList + ')
        ) as PivotTable
    )
    select p.partext, ' + @ColumnList + '
    from c
    join #par p
        on c.parid = p.parid
'
execute(@Command)
...