Операция Set на TSQL (SQL 2005/2008) - PullRequest
       4

Операция Set на TSQL (SQL 2005/2008)

2 голосов
/ 08 сентября 2010

Когда дан набор, скажем {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})

Ответы [ 2 ]

4 голосов
/ 08 сентября 2010
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

... это то, что вы ищете.

0 голосов
/ 08 сентября 2010

Вот решение проблемы с использованием 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 
                  );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...