动态决定连接数

时间:2015-12-03 03:46:54

标签: sql sql-server database join pivot

我有两张桌子。 表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

注意:两个表中都可以有任意数量的记录。如果在option_master中有4条记录,那么我想要4条记录的所有组合。

2 个答案:

答案 0 :(得分:1)

您需要与自己交叉加入Option_Master。然后你需要再次使用Option_Master交叉加入结果。每个问题都必须重复这一点。我认为这必须通过动态创建SQL语句来完成。试试这个例子来了解一下:

text

阿尔伯特

答案 1 :(得分: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