我正在尝试开发一个T-SQL例程(SQL Server 2014),这将允许我查找组内所有记录组合。
鉴于以下数据:
ID_COMBINATION | ID_POSITION | MULTIPLY_FACTOR
-----------------------------------------------
1 | 1 | 1
1 | 1 | 2
1 | 1 | 3
1 | 2 | 1
1 | 2 | 2
1 | 2 | 3
我想计算给定ID_COMBINATION的全套ID_POSITIONS的MULTIPLY_FACTOR组合
结果应为:
1 | 1 | 1
1 | 2 | 1
1 | 1 | 1
1 | 2 | 2
1 | 1 | 1
1 | 2 | 3
...
1 | 1 | 3
1 | 2 | 3
目前我更喜欢关闭例程定义(在运行时使用动态SQL生成多重交叉连接代码,具体取决于组中唯一ID_POSITIONS的数量)
非常感谢你的帮助!
修改
以下TSQL代码计算给定ID_COMBINATION 1的唯一ID_POSITION的组合:
declare @Samples as Table ( Id_Combination Int, Id_Position Int, Multiply_Factor Int );
INSERT INTO @Samples (Id_Combination, Id_Position, Multiply_Factor)
VALUES (1, 1, 1), (1, 1, 2), (1, 1, 3)
, (1, 2, 1), (1, 2, 2), (1, 2, 3)
SELECT
S1.Id_Combination
,S1.Id_Position AS s1_idpos
,S1.Multiply_Factor AS s1_mufac
,S2.Id_Position AS s2_idpos
,S2.Multiply_Factor AS s2_mufac
FROM @Samples AS S1
INNER JOIN @Samples AS S2
ON s1.Id_Combination = s2.Id_Combination
AND s1.Id_Position < s2.Id_Position
但是,如果我添加一个具有相应MULTPLY_FACTOR值的新ID_POSITION键,我将不得不修改连接条件并选择语句以涵盖新场景,例如:
declare @Samples as Table ( Id_Combination Int, Id_Position Int, Multiply_Factor Int );
INSERT INTO @Samples (Id_Combination, Id_Position, Multiply_Factor)
VALUES (1, 1, 1), (1, 1, 2), (1, 1, 3)
,(1, 2, 1), (1, 2, 2), (1, 2, 3),
,(1, 3, 1), (1, 3, 2), (1, 3, 3);
SELECT
S1.Id_Combination
,S1.Id_Position AS s1_idpos
,S1.Multiply_Factor AS s1_mufac
,S2.Id_Position AS s2_idpos
,S2.Multiply_Factor AS s2_mufac
,S3.Id_Position AS s3_idpos
,S3.Multiply_Factor AS s3_mufac
FROM @Samples AS S1
INNER JOIN @Samples AS S2
ON s1.Id_Combination = s2.Id_Combination
AND s1.Id_Position < s2.Id_Position
INNER JOIN @Samples AS S3
ON s2.Id_Combination = s3.Id_Combination
AND s2.Id_Position < s3.Id_Position
回到我的问题一般想法:如何写&#34;泛型&#34;这里的TSQL代码将覆盖ID_POSITION域中所有可能的未来值,并垂直显示值,而不是在SELECT子句中添加新字段。 当然,必须引入一些SUB_COMBINATION键,以使这些组合在父ID_COMBINATION中彼此不同...
答案 0 :(得分:0)
由于我无法弄清楚你的评论:“ID_POSITION的大小”,我只想问为什么这不容易:
-- Sample data.
declare @Samples as Table ( Id_Combination Int, Id_Position Int, Multiply_Factor Int );
insert into @Samples ( Id_Combination, Id_Position, Multiply_Factor ) values
( 1, 1, 1 ), ( 1, 1, 2 ), ( 1, 1, 3 ), -- ( 1, 1, 4 ), -- Try me.
( 1, 2, 1 ), ( 1, 2, 2 ), ( 1, 2, 3 );
select * from @Samples;
-- Generate all possible combinations of all values.
select distinct S1.Id_Combination, S2.Id_Position, S3.Multiply_Factor
from @Samples as S1 cross join @Samples as S2 cross join @Samples as S3
order by Id_Combination, Id_Position, Multiply_Factor;
请注意,如果您取消注释额外的示例数据行,您将获得两个更多结果行。