如何在SQL中用两个表显示父/子关系
我有两个SQL表UM_模块,UM_子模块 在UM_模块表的字段定义中 模块ID 名称 梅纽德 和UM_子模块子表字段定义 子模块ID 模块ID 名称 亚月 下面是两个表中的数据如何在SQL中用两个表显示父/子关系,sql,sql-server,Sql,Sql Server,我有两个SQL表UM_模块,UM_子模块 在UM_模块表的字段定义中 模块ID 名称 梅纽德 和UM_子模块子表字段定义 子模块ID 模块ID 名称 亚月 下面是两个表中的数据 SELECT ModuleID,Name FROM UM_Module SELECT SubModuleID,ModuleID,Name FROM UM_SubModule ModuleID Name ----------- -------------------------------------------
SELECT ModuleID,Name FROM UM_Module
SELECT SubModuleID,ModuleID,Name FROM UM_SubModule
ModuleID Name
----------- --------------------------------------------------
8 Menu Master
9 General Master
10 Master
11 Clients
12 Event Type
(5 rows affected)
SubModuleID ModuleID Name
----------- ----------- --------------------------------------------------
1 8 Menu
2 8 Child Menu
3 9 Role
4 8 Area Management
5 9 Permission
6 9 Role User
7 9 Permission
8 9 Parent-Child Permission
9 9 User Permission
10 9 Role Permission
(10 rows affected)
预期结果
可以帮助我准备上面的输出查询吗
我正在准备一些查询,但没有得到我想要的确切结果
SELECT cdo.SubModuleID,parent.ModuleID,parent.Name ParentName,
CONCAT(parent.Name, ' - ', cdo.Name) AS ChildName
FROM UM_SubModule AS cdo
JOIN UM_Module AS parent
ON (cdo.ModuleID = parent.ModuleID)
//Query output
SubModuleID ModuleID ParentName ChildName
----------- ----------- ---------------- ---------------------------------------
1 8 Menu Master Menu Master - Menu
2 8 Menu Master Menu Master - Child Menu
3 9 General Master General Master - Role
4 8 Menu Master Menu Master - Area Management
5 9 General Master General Master - Permission
6 9 General Master General Master - Role User
7 9 General Master General Master - Permission
8 9 General Master General Master - Parent Child Permission
9 9 General Master General Master - User Permission
10 9 General Master General Master - Role Permission
您需要按如下方式进行联合:
SELECT cdo.SubModuleID,
parent.ModuleID,
null as ParentName,
cdo.Name AS ChildName
FROM UM_SubModule AS cdo
JOIN UM_Module AS parent
ON cdo.ModuleID = parent.ModuleID
Union all
Select null,
moduleid,
name,
null
From UM_Module
Order by moduleid, SubModuleID
除了Popeye的UNION ALL选项外,您还可以在应用程序中执行此操作。这样可以避免扫描父表两次:
选择v*
从UM_模块作为父模块
交叉应用
选择parent.ModuleID,parent.Name,child.SubModuleID,ChildName=child.Name
从UM_子模块作为子模块
其中child.ModuleID=parent.ModuleID
联合所有
选择parent.ModuleID、parent.Name、NULL、NULL
v
感谢您的回答,我在执行查询Msg 4104,级别16,状态1,第7行时遇到错误。无法绑定多部分标识符cdo.ModuleID。很抱歉为您修复了此问题。你知道它是干什么的吗?谢谢,大力水手,它很有魅力
SELECT cdo.SubModuleID,
parent.ModuleID,
null as ParentName,
cdo.Name AS ChildName
FROM UM_SubModule AS cdo
JOIN UM_Module AS parent
ON cdo.ModuleID = parent.ModuleID
Union all
Select null,
moduleid,
name,
null
From UM_Module
Order by moduleid, SubModuleID