动态决定连接数
Dynamically decide number of joins
我有两张桌子。
Table 1: Question_Master 其中包含问题
id question
1 Q1
2 Q2
3 Q3
Table 2: Option Master 其中包含Options
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 中可以有任意数量的记录它在 option_master 中有 4 条记录比我想要 4 条记录的所有组合。
您需要 CROSS JOIN 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)
阿尔伯特
您可以通过使用一些字符串连接查询动态地执行此操作,以根据 Question_Master table 值
构建 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
将允许您在值中包含空格或其他一些字符的问题。
我有两张桌子。 Table 1: Question_Master 其中包含问题
id question
1 Q1
2 Q2
3 Q3
Table 2: Option Master 其中包含Options
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 中可以有任意数量的记录它在 option_master 中有 4 条记录比我想要 4 条记录的所有组合。
您需要 CROSS JOIN 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)
阿尔伯特
您可以通过使用一些字符串连接查询动态地执行此操作,以根据 Question_Master table 值
构建 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
将允许您在值中包含空格或其他一些字符的问题。