Sql 从3个表构建层次结构
我需要从3个表中返回父子关系,这3个表分别用于底层、中层和顶层。到目前为止,简单的事情已经完成:Sql 从3个表构建层次结构,sql,Sql,我需要从3个表中返回父子关系,这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, txt
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}。问题是第三个 表格结构如下: 一级<代码>ID int;txtName varchar(50) 二级<代码>ID int;Level1ID-int;txtName varchar(50) 三级<代码>ID int;Level2ID int;txtName varchar(50) 如何在第三个表(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
我会质疑你的数据库设计,因为对于我来说,为每个“级别”单独设置表似乎是个坏主意。由于我不知道您的应用程序的所有细节,所以我暂时假设它必须是这样的。另外,在我看来,在ID上添加数字的整个过程就像一个大杂烩,以后会咬到你的 另一个更直接、更具约束性的问题是,看起来您希望第三个结果集的列数与前两个结果集的列数不同。对于联合运算符,这是不可能的
如果要在前两个查询中添加另一列,则只需在级别3和级别2表之间连接以获得级别1 ID,就可以在第三个查询中获得所需内容。通过在级别3上选择中连接到级别2解决了此问题:
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
我现在假设它是正确的。我必须改造一个现有的系统,并使用更现代化的控件一页一页地进行。不幸的是,处理错误的等级制度和更多的痛苦现在已经产生。谢谢你的意见。如果你能展示一些示例数据和一个查询的预期结果,那就容易多了。