Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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 从3个表构建层次结构_Sql - Fatal编程技术网

Sql 从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

我需要从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, 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

我现在假设它是正确的。我必须改造一个现有的系统,并使用更现代化的控件一页一页地进行。不幸的是,处理错误的等级制度和更多的痛苦现在已经产生。谢谢你的意见。如果你能展示一些示例数据和一个查询的预期结果,那就容易多了。