【问题标题】:Dynamically decide number of joins动态决定连接数
【发布时间】:2015-12-03 03:46:54
【问题描述】:

我有两张桌子。 表 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 条记录的所有组合。

【问题讨论】:

  • 交叉连接+数据透视表!查一下!
  • 您好尝试过,但问题是,如何动态决定交叉连接的数量。根据问题_master中的记录数
  • 寻找Dynamic pivoting table sql server你会找到很多答案!

标签: sql sql-server database join pivot


【解决方案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

【讨论】:

  • 你是个天才。有时我们会让事情变得复杂。我试图用 pivot 来解决,谢谢
【解决方案2】:

您需要将 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)

阿尔伯特

【讨论】:

  • 把exec(@Sql)改成print(@sql)查看生成的SQL
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 2020-09-26
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
相关资源
最近更新 更多