【问题标题】:Set operation on TSQL (SQL 2005/2008)在 TSQL 上设置操作 (SQL 2005/2008)
【发布时间】:2011-04-09 13:52:07
【问题描述】:

当给定一个集合时说{1,2,3,4,5,6} 任务是分离一对子集

{1,2},
{1,3},
{1,4},
{1,5},
{1,6},
{2,3},
{2,4},
{2,5},
{2,6},
{3,4},
{3,5},
{3,6},
{4,5},
{5,6}

所以当我有一张桌子时

Table Element
1
2
3
4
5
6

列出所有可能的逗号分隔子集对的方法是什么? (可以忽略重复项(即){1,2} 与 {2,1} 相同)

【问题讨论】:

    标签: tsql join


    【解决方案1】:
    SELECT T1.elem, T2.elem
    FROM MyTable T1
    INNER JOIN MyTable T2
    ON T2.elem > T1.elem
    

    ...让您大部分时间到达那里 - 如果您希望将这些显示为集合,那么...

    SELECT '{' + CAST(T1.elem AS VARCHAR(12)) + ', ' + CAST(T2.elem AS VARCHAR(12)) + '}'
    FROM MyTable T1
    INNER JOIN MyTable T2
    ON T2.elem > T1.elem
    

    ...是你所追求的。

    【讨论】:

      【解决方案2】:

      这是使用 CTE 解决问题的方法。它不是特别优雅,但可以完成工作。

      DECLARE @set TABLE (Element INT);
      
      INSERT INTO @set(Element) VALUES (1);
      INSERT INTO @set(Element) VALUES (2);
      INSERT INTO @set(Element) VALUES (3);
      INSERT INTO @set(Element) VALUES (4);
      INSERT INTO @set(Element) VALUES (5);
      INSERT INTO @set(Element) VALUES (6);
      
      ;WITH array (Element1, Element2, Row)
      AS
      (
      SELECT t.Element
           , t2.Element
           , ROW_NUMBER() OVER(ORDER BY t.Element)
        FROM @set AS t
       CROSS JOIN @set AS t2
       WHERE t.Element <> t2.Element  
      )
      SELECT a.Element1
           , a.Element2
           , '{' + CONVERT(VARCHAR(5),a.Element1) + ',' + CONVERT(VARCHAR(5),a.Element2) + '}' AS 'Subset'
        FROM array AS a
       WHERE NOT EXISTS (SELECT *
                           FROM array AS sa
                          WHERE sa.Element1 = a.Element2 
                            AND sa.Element2 = a.Element1 
                            AND sa.Row < a.Row 
                        );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 2011-01-13
        • 1970-01-01
        相关资源
        最近更新 更多