我有3张桌子
组
组ID
组名
亚群
SubGroupID
SubGroupName
GroupID(FK成组)
每个链接都需要一个GroupID,但SubGroupID是可选的。如何编写SQL查询以显示:
Links.LinkName,Groups.GroupName,SubGroup.SubGroupName
对于没有子组的记录,只需在该字段中输入空白条目。如果我有250个链接行,我应该从这个查询中获得250个reecords。
有没有办法在一个查询中执行此操作,还是需要执行多个查询?
答案 0 :(得分:5)
这假设每组最多只有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)
答案 1 :(得分:1)
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的问题) 顺便说一下,为什么不将组和子组保存在同一个表中,并使用自引用连接?
Akantro:
你有这样的事情: 创建表组( groupid整数主键, parentgroupid整数外键引用组(groupid), groupname 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
保持这样的表没有功能上的区别,但好处是你只需要到一个地方来编辑组/子组
答案 2 :(得分:1)
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
答案 3 :(得分:1)
您将使用外部加入:
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
答案 4 :(得分:0)
你不太清楚,但我认为你想获得所有行,包括那些在SubGroup表中没有通讯者的行。
为此您可以使用LEFT JOIN,如果没有匹配的行,它将获取NULL。
答案 5 :(得分:0)
只需在子组表上使用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 )
应该这样做。
答案 6 :(得分:0)
SELECT LinkName, GroupName, SubGroupNamne
FROM Links INNER JOIN Groups ON LInks.GroupID = Groups.GroupID
LEFT JOIN SubGroup ON Links.SubGroupID = SubGroup.SubGroupID
这将包括没有子组的行。那列只是NULL。
答案 7 :(得分:0)
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
答案 8 :(得分:0)
好的,试试:
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
我认为应该可以工作(它在我最常使用的DBMS中运行) - 您需要调整第二个选择中的空格以匹配subgroup.subgroupname大小。
答案 9 :(得分:0)
在子组表上使用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