SQL联接问题
我有3张桌子
- 链接链接ID链接名称GroupID(从FK到组)SubGroupID(从FK到子组)
- 组GroupID GroupName
- SubGroup SubGroupID SubGroupName GroupID(FK分为组)
每个链接都需要有一个GroupID,但是SubGroupID是可选的。如何编写SQL查询以显示:
Links.LinkName,Groups.GroupName,SubGroup.SubGroupName
对于没有子组的记录,只需在该字段中输入一个空白条目即可。如果我有250个链接行,则应该从此查询中获取250条记录。
有一种方法可以在一个查询中执行此操作,还是需要执行多个查询?
解决方案
SELECT links.linkname , groups.groupname , subgroup.groupname FROM links JOIN groups ON links.groupid = groups.groupid LEFT OUTER JOIN subgroups ON links.subgroupid = subgroup.subgroupid
(重新添加以解决OP的问题)
顺便说一句,为什么不将组和子组保留在同一表中,并使用自引用联接?
阿坎特罗语:
我们会有类似这样的内容:
创建表组(
groupid整数主键,
parentgroupid整数外键引用组(groupid),
组名varchar(50))
查询将是
SELECT links.linkname , groups.groupname , SUBGROUPS.groupname FROM links JOIN groups ON links.groupid = groups.groupid LEFT OUTER JOIN groups SUBGROUPS ON links.subgroupid = subgroup.groupid
保持这样的表没有功能上的区别,但是好处是我们只需要去一个地方编辑组/子组
假设每个组最多只有1个子组。如果还有更多,那么我们就有可能获得其他记录。
select links.linkname, groups.groupname, subgroup.subgroupname from links inner join groups on (links.groupid = groups.groupid) left outer join subgroup on (links.subgroupid = subgroup.subgroupid)
我们不太清楚,但是我认为我们想获取所有行,包括在SubGroup表中没有对应行的行。
为此,我们可以使用LEFT JOIN,如果没有匹配的行,它将获取NULL。
SELECT Links.LinkName, Groups.GroupName, SubGroup.SubGroupName -- Will potentially be NULL FROM Links INNER JOIN Groups ON Group.GroupID = Links.GroupID LEFT JOIN SubGroup ON SubGroup.SubGroupID = Links.SubGroupID
我们将使用外部联接:
select Links.LinkName, Groups.GroupName, SubGroup.SubGroupName from Links inner join Groups on Groups.GroupID = Links.GroupID left outer join SubGroup on Links.SubGroupID = SubGroup.SubGroupID
只需在SubGroup表上使用LEFT OUTER JOIN即可:
select l.LinkName, g.GroupName, s.SubGroupName from Links l ' JOIN Group g on ( g.GroupId = l.GroupId) ' LEFT OUTER JOIN SubGroup s on ( s.SubGroupId = l.SubGroupId )
那应该做。
SELECT LinkName, GroupName, SubGroupNamne FROM Links INNER JOIN Groups ON LInks.GroupID = Groups.GroupID LEFT JOIN SubGroup ON Links.SubGroupID = SubGroup.SubGroupID
这将包括没有子组的行。该列将只是NULL。
select L1.LinkName, G1.GroupName, NVL(S1.SubGroupName,' ') from Links L1, Groups G1, SubGroup S1 where L1.GroupID = G1.GroupID and L1.GroupID = S1.GroupID
好的,尝试:
select a.linkname, b.groupname, c.subgroupname from links a, groups b, subgroup c where a.groupid = b.groupid and a.subgroupid = c.subgroupid and a.subgroupid is not null union all select a.linkname, b.groupname, ' ' from links a, groups b where a.groupid = b.groupid and a.subgroupid is null
我认为这应该工作(在DB2中,这是我最常用的DBMS),我们需要调整第二个选择中的空格以匹配subgroup.subgroupname大小。
在SubGroup表上使用LEFT OUTER JOIN将为我们提供Links表中的所有行,并且存在SubGroup的地方将返回该行,否则我们将看到NULL值。
SELECT L.LinkName, G.GroupName, S.SubGroupName FROM Links As L INNER JOIN Groups As G ON L.GroupID=G.GroupID LEFT OUTER JOIN SubGroup S ON L.SubGroupID=S.SubGroupID
这不会检查SubGroups.LinkID是否匹配永远不会发生的Links.LinkID,但是如果我们需要检查它,则在连接中添加另一个子句:
SELECT L.LinkName, G.GroupName, S.SubGroupName FROM Links As L INNER JOIN Groups As G ON L.GroupID=G.GroupID LEFT OUTER JOIN SubGroup S ON L.SubGroupID=S.SubGroupID AND L.GroupID=S.GroupID