2015-12-03 73 views
0

我有兩個表。 表1:Question_Master其中包含的問題動態決定連接數

id question 
    1 Q1 
    2 Q2 
    3 Q3 

表2:選擇主站,它包含的選項

id option 
1 H 
2 N 
3 S 

我想要的選項所有組合的所有問題。

像這樣

Q1 Q2 Q3 
    H H H 
    H H N 
    H H s 
    H N H 

注:可以有任意數量的中均有記載table.If它有4個記錄option_master比我想的4條記錄所有組合。

+2

交叉連接+旋轉表!查看它! –

+0

你已經嘗試過了,但問題是,如何動態決定交叉連接的數量。基於question_master中的記錄數 – gkarya42

+0

尋找'動態數據轉換表sql服務器'你會發現很多答案! –

回答

1

您可以通過使用一些字符串連接查詢基礎上,Question_Master表打造出來的Select語句做動態值

DECLARE @SelectSQL VARCHAR(MAX), 
     @JoinSQL VARCHAR(MAX), 
     @OrderSQL VARCHAR(MAX) 

SELECT @SelectSQL = COALESCE(@SelectSQL + ',', '') 
      + QUOTENAME(question) + '.[option] as ' + QUOTENAME(question), 
     @JoinSQL = COALESCE(@JoinSQL + ' CROSS JOIN ', '') 
      + 'Option_Master as ' + QUOTENAME(question), 
     @OrderSQL = COALESCE(@OrderSql + ',', '') 
      + QUOTENAME(question) + '.[option]' 
FROM Question_Master 
ORDER BY question 


DECLARE @Sql AS NVARCHAR(MAX) = N'SELECT ' + @SelectSQL + ' FROM ' + @JoinSQL + ' ORDER BY ' + @OrderSQL 
EXECUTE sp_executesql @Sql; 

使用QUOTENAME將允許您有問題的值有空格或其他字符。

SQL Fiddle Example

+0

您是天才。有時我們使事情變得複雜。我試圖解決使用樞軸,謝謝 – gkarya42

1

您需要CROSS加入Option_Master自己。然後您需要再次與Option_Master交叉加入結果。這個問題必須重複。我認爲這必須通過動態創建SQL語句來完成。嘗試這個例子來得到一個想法:

declare @NumberOfQuestions int 

set @NumberOfQuestions = (
    select count(*) 
    from question_master 
    ) 

declare @sql varchar(max) 

set @sql = 'select om1.opt ' 

declare @counter int 

set @counter = 2 
while @Counter <= @NumberOfQuestions 
begin 
    set @sql = @sql + ' 
    , om' + cast (@counter as varchar(1)) + '.opt ' 
    set @counter = @counter + 1 
end 

set @sql = @sql + ' 
    from option_master om1 ' 

set @counter = 2 
while @Counter <= @NumberOfQuestions 
begin 
    set @sql = @sql + ' 
    cross join option_master om' + cast(@counter as varchar(1)) + ' ' 
    set @counter = @counter + 1 
end 

set @sql = @sql + ' 
    order by om1.opt ' 

set @counter = 2 
while @Counter <= @NumberOfQuestions 
begin 
    set @sql = @sql + ' 
    , om' + cast(@counter as varchar(1)) + '.opt ' 
    set @counter = @counter + 1 
end 

exec (@sql) 

阿爾伯特

+0

將exec(@Sql)更改爲print(@sql)以查看生成的SQL –