如何使用SQL Server从大型列表构建类别结构

时间:2016-12-20 14:37:13

标签: sql sql-server

我有一个包含以下ID的大约2百万条记录的巨大列表。

ID, Cat1, Cat2, Cat3, Cat4, Cat5, Name

所有猫场都依赖。因此,Cat1是第一个父级,Cat2依赖于Cat1,而Cat3依赖于Cat2,依此类推。

通过这种方式,您可以想象一个类似于树结构的资源管理器,您可以在其中拥有所有Cat1值,具体取决于您选择的Cat1等Cat2等。

我的计划是构建一个简单的JSON对象,它代表所有200万条记录中的完整结构。

我知道,最简单的方法是做一个简单的SELECT * FROM LIST,然后将每个类别放入结果对象中,只要它不存在即可。但这需要很长时间,因为我需要通过所有200万条记录。

构建该结构的最快方法是什么?

我的第二种方法是只进行SELECT DISTINCT Cat1 ...以获取Cat1的所有值,然后为每个Cat1执行SELECT DISTINCT Cat2 ... WHERE Cat1 = X,然后再为每个Cat2执行一次(对于每个Cat1)等。< / p>

但是这会在我需要发送给SQL Server的很多SQL查询中结束。

是否还有其他方法(较少的SQL查询)来构建代表所有200万条记录中所有类别的完整结构?

我的目标是获得良好的表现(理想情况下在几秒钟内获得最终结构)。

我将使用C#2013(.NET)构建连接到SQL Server的工具。

2 个答案:

答案 0 :(得分:0)

如果我理解正确,这应该链接所有匹配的ID:

select distinct
    t.id
    , t.Cat1
    , t2.Cat2
    , t3.Cat3
    , t4.Cat4
    , t5.Cat5
    , t.Name
from Table t
    inner join table t2
    on t.Cat1 = t2.Cat2
    inner join table t3
    on t2.Cat2 = t3.Cat3
    inner join table t4
    on t3.Cat3 = t4.Cat4
    inner join table t5
    on t4.Cat4 = t5.Cat5

答案 1 :(得分:0)

也许这就是你要找的东西:

select distinct
    t.Id
    , t2.cat1
    , t3.cat2
    , t4.cat3
    , t5.cat4
    , t6.cat5
    , Name
from Table t
    left join (select distinct cat1 from Table t2) t2
    on t2.Id = t.Id
    left join (select distinct cat2 from Table t3) t3
    on t3.Id = t.Id
    left join (select distinct cat3 from Table t4) t4
    on t4.Id = t.Id
    left join (select distinct cat4 from Table t5) t5
    on t5.Id = t.Id
    left join (select distinct cat5 from Table t6) t6
    on t6.Id = t.Id

或许这个:

select distinct
    Id
    , name
    , cat1
from Table t
union all
select distinct
    cat2
from Table t
union all
select distinct
    cat3
from Table t
union all
select distinct
    cat4
from Table t
union all
select distinct
    cat5
from Table t