从3个表构建层次结构

时间:2010-09-08 13:38:52

标签: sql

我需要从3个表中返回父子关系,这些表分别用于底层,中层和顶层。到目前为止很简单,已经完成了:

SELECT -1 ParentID, ID + 100000 ID,  txtName Value from tblLevel1
UNION
SELECT Level1ID + 100000 ParentID, ID + 50000 ID, txtName Value from tblLevel2
UNION
SELECT Level2ID + 50000 ParentID, ID ID, txtName Value from tblLevel3

我的问题是我需要添加另一个描述每个条目路径的字段。

对于第一个表,它是'-1; {id}) 对于第二个表格是'{Level1id}; {id}' 第三个表的查询应该返回'{Level1id}; {Level2id}; {id}'。问题是第三个问题。

表结构是:

级别1; ID int; txtName varchar(50)

级别2; ID int; Level1ID int; txtName varchar(50)

级别3; ID int; Level2ID int; txtName varchar(50)

如何在第3个表(Level3)上获取查询的完整路径?

这是当前的结果

ParentID  ID       Value
-1       100001 Test company
-1       100006 Company A
-1       100007 Company B
-1       100008 The Primary Client
-1       100009 Overseas Client  1
100001  50001   Distribution
100006  50016   Attributes
100007  50018   Attributes
100008  50019   Development
100009  50029   Database
50001   1        Balance Sheet
50001   7        Cash Flow Statement
50001   10       Income Statement
50016   20       Vehicles
50016   21       Drivers
50019   33       Health
50029   29       Database

2 个答案:

答案 0 :(得分:2)

我会质疑你的数据库设计,因为每个“级别”的单独表对我来说似乎是一个坏主意。由于我不知道你的应用程序的所有细节,我现在假设它是如何必须的。此外,在ID中添加数字的整个业务在我看来就像是一个稍后会咬你的大笨蛋。

另一个更直接且更具约束力的问题是,您希望第三个结果集的列数与前两个结果集的列数不同。使用UNION运算符是不可能的。

如果你想在前两个查询中添加另一个列,那么你应该能够通过在3级和2级表之间加入来获得第1级ID来获得你想要的第三个查询。

答案 1 :(得分:1)

通过加入第3级选择中的level2来解决它:

SELECT -1 ParentID, ID + 100000 ID,  txtName Value, '-1;'+ cast(ID as varchar(10)) nodePath from tblLevel1
UNION
SELECT Level1ID + 100000 ParentID, ID + 50000 ID, txtName Value, '-1;'+ cast(Level1ID as varchar(10))+ ';'+ cast(ID as varchar(10)) nodePath from tblLevel2
UNION
SELECT Level2ID + 50000 ParentID, ID ID, txtName Value '-1;'+ cast(p.Level1ID as varchar(10))+ ';'+cast(m.Level2ID as varchar(10))+ ';'+cast(m.ID as varchar(10)) nodePath from tblLevel3
inner join tblLevel2 p on p.ID = m.Level2ID 

结果:

-1      100001  RRM Financial Master Templates  -1;1
-1      100006  Company A                       -1;6
-1      100007  Company B                       -1;7
-1      100008  The Primary Client              -1;8
-1      100009  Overseas Client 1               -1;9
100001  50001   Distribution                    -1;1;1
100006  50016   Attributes                      -1;6;16
100007  50018   Attributes                      -1;7;18
100008  50019   Development                     -1;8;19
100009  50029   Database                        -1;9;29
50001   1       Balance Sheet                   -1;1;1;1
50001   7       Cash Flow Statement             -1;1;1;7
50001   10      Income Statement                -1;1;1;10
50016   20      Vehicles                        -1;6;16;20
50016   21      Drivers                         -1;6;16;21
50019   33      Health                          -1;8;19;33
50029   29      Database                        -1;9;29;29