SQL One to Many加入每个连接获得单个结果

时间:2014-05-26 15:29:51

标签: sql

我想将数据从SQL 2008服务器导出到文件,csv或excel无关紧要。在数据库中,我有两个实体,问题和答案。问题是问题有多个答案。然后,连接将导致每个问题有多行。我怎么能这样做,结果只是每个问题和答案一行,只是每个答案添加一个新列。像这样:

表格结构:

Question
-------------
Id
Text
Category

Answer
-------------
Id
Text
IsCorrect
QuestionId

结果示例:

         Col1       Col2           Col3          Col4          Col5          Col6          Col7
Result1: Question1, Question1Text, Answer1Prop1, Answer1Prop2, Answer2Prop1, Answer2Prop2, null
Result2: Question2, Question2Text, Answer3Prop1, Answer3Prop2, Answer4Prop1, Answer4Prop2, Answer5Prop3

1 个答案:

答案 0 :(得分:1)

如果您可以使用包含所有问题的连接和包含多行的所有答案生成结果,就像您描述的那样,我认为您可以使用游标循环遍历所有问题和答案,然后有一个temptable / “哈希表”(#tableOfAnswers)来保存你的最终结果。对于问题的每个答案,您可以更改#table并添加新列。

这样的事情可能会让你朝着正确的方向前进。

如果您的结果看起来像这样: (在我的例子中,我将结果存储在名为“#q”的临时表中)

QuestionId  text
1           answer1
1           answer2
1           answer3
1           answer4
2           answer1
2           answer2

然后你可以在结果上声明一个光标

Declare @questionId int
, @questionText varchar(max)
, @prevId int
, @colNo int = 1
, @colMax int = 0
, @i int = 1
, @sql nvarchar(max)
, @nulls nvarchar(max) = ''

Create table #tempTable
(
    QuestionId int not null,
    Col1 varchar(max) null
)

Declare question_cursor cursor for
Select QuestionId, text
From #q

Open question_cursor

FETCH NEXT FROM question_cursor 
INTO @questionId, @questionText

Set @prevId = 0

WHILE @@FETCH_STATUS = 0
BEGIN
If (@prevId = @questionId)
Begin
    If (@colNo > @colMax)
    Begin
        Set @sql = N'alter table #tempTable add Col' + cast(@colNo as varchar) + ' varchar(max) null'
        exec sp_executesql @statement = @sql

        Set @colMax = @colMax + 1
    End

    Set @sql = N'update #tempTable set Col' + cast(@colNo as varchar) + ' = ''' + @questionText + ''' where QuestionId = ' + cast(@questionId as varchar)

    print @sql

    exec sp_executesql @statement = @sql
    Set @colNo = @colNo + 1
End
Else Begin
    Set @prevId = @questionId
    Set @colNo = 1

    while (@i <= @colMax)
    begin
        set @nulls = @nulls + ', null'
        set @i = @i + 1
    end

    Set @sql = N'insert into #tempTable values (' + cast(@questionId as varchar) + ', ''' + @questionText + '''' + isnull(@nulls, '') +')'

    print @sql

    exec sp_executesql @statement = @sql
    Set @colNo = @colNo + 1
End 

FETCH NEXT FROM question_cursor 
INTO @questionId, @questionText
END

Close question_cursor
Deallocate question_cursor

Select * from #tempTable

这会产生如下结果:

QuestionId    Col1    Col2    Col3    Col4
1             text1   text2   text3   text4
2             text1   text2   NULL    NULL

并不像.Net(或者甚至是javascript)那样优雅地处理这样的问题..但是,你要做什么? :) 我希望这可能会对你的问题有所了解:)

要将其导出到文件,我只需将结果复制/粘贴到Sql Management Studio中并将其粘贴到Excel或其他内容中;)