各位专家:
若有以下两列数据(Con1和Con2为关联的一对数据)
Con1 Con2
A      B
A      C
A      D 
A      E
B      C
B      D
B      E
C      D
C      F
...
如何找出有两两关系的一组数据哦?如A-B-C,A-B-C-D,B-C-D的两两有关联的数据。求解,谢谢!

解决方案 »

  1.   

    最终你要的结果是? A_B_C_D_E_F ?
      

  2.   

    只要在两列数据(每行是一对关系)存在之间都有关系的都找出来,但A_B_C_D_E_F不存在D_E,D_F的关系,所以不能构成这样的链。
      

  3.   

    ;WITH TT
    AS(
    SELECT con1 AS bg,con2 AS ed FROM dbo.TB
    UNION ALL
    SELECT con2,con1 FROM TB),NextW AS(
    SELECT bg,ed,CASt('-'+bg+'-'+ed+'-' AS varchar(MAX)) AS ww
    FROM TT
    UNION ALL
    SELECT A.bg,B.ed,CAST(A.ww+B.ed+'-' AS VARCHAR(MAX)) FROM NextW AS A
    INNER JOIN TT B ON CASE WHEN A.ww LIKE '%-'+B.ed +'-%' THEN 1 ELSE 0 END =0
    AND A.ed = b.bg)SELECT REPLACE(ww,'-','') AS ww FROM NextW WHERE EXISTS(SELECT 1 FROM TB WHERE bg =con1)/*
    AB
    AC
    AD
    AE
    BC
    BD
    BE
    CD
    CF
    BA
    CA
    CB
    CBD
    CBE
    CBA
    CBAD
    CBAE
    CBEA
    CBEAD
    CBDA
    CBDAE
    CAB
    CAD
    CAE
    CAEB
    CAEBD
    CADB
    CADBE
    CABD
    CABE
    BAC
    BAD
    BAE
    BADC
    BADCF
    BACD
    BACF
    CDA
    CDB
    CDBE
    CDBA
    CDBAE
    CDBEA
    CDAB
    CDAE
    CDAEB
    CDABE
    BEA
    BEAC
    BEAD
    BEADC
    BEADCF
    BEACD
    BEACF
    BDA
    BDC
    BDCF
    BDCA
    BDCAE
    BDAC
    BDAE
    BDACF
    BCD
    BCF
    BCA
    BCAD
    BCAE
    BCDA
    BCDAE
    AEB
    AEBC
    AEBD
    AEBDC
    AEBDCF
    AEBCD
    AEBCF
    ADB
    ADC
    ADCF
    ADCB
    ADCBE
    ADBC
    ADBE
    ADBCF
    ACD
    ACF
    ACB
    ACBD
    ACBE
    ACDB
    ACDBE
    ABC
    ABD
    ABE
    ABDC
    ABDCF
    ABCD
    ABCF*/
      

  4.   

    谢谢专家OrchidCat,我测试下,如果存在几十行或更多的数据,则出现执行较慢,同时我想增加如果关系链才3个以下就不用显示,如AB或ABC就不显示了,且存在重复的需要去掉,如ABC和BCA或CBA等则只保留一个。这种如何处理哦。
      

  5.   

    ;WITH TT
    AS(
    SELECT con1 AS bg,con2 AS ed FROM dbo.TB
    ),NextW AS(
    SELECT bg,ed,CASt('-'+bg+'-'+ed+'-' AS varchar(MAX)) AS ww
    FROM TT
    UNION ALL
    SELECT A.bg,B.ed,CAST(A.ww+B.ed+'-' AS VARCHAR(MAX)) FROM NextW AS A
    INNER JOIN TT B ON CASE WHEN A.ww LIKE '%-'+B.ed +'-%' THEN 1 ELSE 0 END =0
    AND A.ed = b.bg)SELECT REPLACE(ww,'-','') AS ww  FROM NextW WHERE LEN(REPLACE(ww,'-','')) >=3
    ORDER BY REPLACE(ww,'-','')/*
    ABC
    ABCD
    ABCF
    ABD
    ABE
    ACD
    ACF
    BCD
    BCF*/
      

  6.   


    ;WITH TT
    AS(
    SELECT con1 AS bg,con2 AS ed FROM dbo.TB
    ),
     
    NextW AS(
    SELECT bg,ed,CASt('-'+bg+'-'+ed+'-' AS varchar(MAX)) AS ww
    FROM TT
    UNION ALL
    SELECT A.bg,B.ed,CAST(A.ww+B.ed+'-' AS VARCHAR(MAX)) FROM NextW AS A
    INNER JOIN TT B ON CASE WHEN A.ww LIKE '%-'+B.ed +'-%' THEN 1 ELSE 0 END =0
    AND A.ed = b.bg)
     
    SELECT REPLACE(ww,'-','') AS ww  FROM NextW WHERE LEN(REPLACE(ww,'-','')) >=3
    ORDER BY REPLACE(ww,'-','')
     
    /*
    ABC
    ABCD
    ABCF
    ABD
    ABE
    ACD
    ACF
    BCD
    BCF*/