2010-09-08 6 views
2

Lorsqu'un ensemble est donnée dire {1,2,3,4,5,6} La tâche est de SEPARE paire de sous-ensemblesopération Set sur TSQL (SQL 2005/2008)

{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} 

Alors, quand j'ai une table

Table Element 
1 
2 
3 
4 
5 
6 

Qu'est-ce que est le moyen de lister toutes les paires possibles de sous-ensembles séparés par des virgules? (duplicatas peuvent être ignorés (ie) {1,2} est identique à {2,1})

Répondre

4
SELECT T1.elem, T2.elem 
FROM MyTable T1 
INNER JOIN MyTable T2 
ON T2.elem > T1.elem 

... vous obtient plus du chemin - si vous voulez ces ensembles comme le montre alors. ..

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 

... est ce que vous êtes après.

0

Voici une solution au problème en utilisant un CTE. Ce n'est pas particulièrement élégant, mais il fait le travail.

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 
       );