Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我知道sql中每个集群中的点时,计算集群的数量_Sql_Sql Server_Sql Server 2008_Closures - Fatal编程技术网

当我知道sql中每个集群中的点时,计算集群的数量

当我知道sql中每个集群中的点时,计算集群的数量,sql,sql-server,sql-server-2008,closures,Sql,Sql Server,Sql Server 2008,Closures,当我知道每个集群的所有成员时,我试图计算集群的数量 我需要SqlServer2008中的一个函数来解决这个问题 我的表有1400多万条不同的记录,如下所示: CREATE TABLE Test ( F1 varchar(5), F2 varchar(5) ) INSERT INTO TEST ( F1, F2) VALUES ( 'A', 'B') INSERT INTO TEST ( F1, F2 ) VALUES ( 'A', 'K') INSERT INTO TEST ( F

当我知道每个集群的所有成员时,我试图计算集群的数量

我需要SqlServer2008中的一个函数来解决这个问题

我的表有1400多万条不同的记录,如下所示:

CREATE TABLE Test
(
   F1 varchar(5),
   F2 varchar(5)
)
INSERT INTO TEST ( F1, F2) VALUES ( 'A', 'B')
INSERT INTO TEST (  F1, F2 ) VALUES ( 'A', 'K')
INSERT INTO TEST ( F1, F2) VALUES ( 'C', 'H')
INSERT INTO TEST (  F1, F2 ) VALUES ( 'D', 'B')
INSERT INTO TEST (  F1, F2 ) VALUES ( 'F', 'I')
INSERT INTO TEST (  F1, F2 ) VALUES ( 'F', 'B')
INSERT INTO TEST (  F1, F2 ) VALUES ( 'D', 'H' )
INSERT INTO TEST (  F1, F2 ) VALUES ( 'E', 'G' )
INSERT INTO TEST (  F1, F2 ) VALUES ( 'G', 'L' )
请注意:

If A=B AND A=K THEN B=K 
IF E=G AND G=L THEN E=L
现在,函数的输出应如下所示:

ClusterNumber--- point
1---A
1---B
1---k
1---D
1---F
1---I
1---H
1---C
2---E
2---G
2---L

我猜解决方案是递归函数,但我不知道

在普通SQL中无法计算可传递闭包。它们是使用PL/SQL和类似语言的关键示例。您可能需要研究相关问题,例如:

无论如何,你需要的搜索词是闭包。你有一个关系,但你想得到关系的闭包。

我用C#在递归函数中使用EntityFrameWork和LINQ来解决它

-注意,我为clusterlabel添加了一个新的列Clus

因此,将此循环放在主代码中:

    foreach (var item1 in db.Test.ToList())
    {
        FirstFunc(item1, item1.F1);
    }
并使用以下功能:

private void FirstFunc(Test item1,string cc)
{
    if (item1.Clus == null)
    {
        item1.Clus = cc;
        db.SaveChanges();

        RecFunc(item1, cc);
    }
}


private void RecFunc(Test item1,string cc)
{
        var t1 = db.Test.Where(x => (x.F1 == item1.F1 | x.F2 == item1.F1 | x.F1 == item1.F2| x.F2 == item1.F2) & x.Clus == null).ToList();
        foreach (var item2 in t1)
        {
            item2.Clus = cc;
            db.SaveChanges();
            RecFunc(item2,cc);
        }
}
结果是:

然后:

 var ClusterCount = db.Test.Select(x => x.Clus).Distinct().Count();

希望这有帮助

我的问题是在SQLServer2008oops中。然后在SQL server文档中搜索“可传递闭包”!