TSQL:查找组内没有交叉连接的行组合

时间:2016-12-17 10:40:00

标签: tsql sql-server-2014

我正在尝试开发一个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中彼此不同...

1 个答案:

答案 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;

请注意,如果您取消注释额外的示例数据行,您将获得两个更多结果行。