SQL 连接问题
Posted
技术标签:
【中文标题】SQL 连接问题【英文标题】:SQL Join question 【发布时间】:2008-10-02 14:08:21 【问题描述】:我有 3 张桌子
-
链接
链接 ID
链接名称
GroupID(FK 成组)
SubGroupID(FK 到子组)
组 组ID 组名
子组 子组ID 子组名称 GroupID(FK 到组)
每个链接都需要有一个 GroupID,但 SubGroupID 是可选的。我如何编写一个 SQL 查询来显示:
Links.LinkName、Groups.GroupName、SubGroup.SubGroupName
对于没有子组的记录,只需在该字段中输入一个空白条目。如果我有 250 个链接行,我应该从这个查询中取回 250 条记录。
有没有办法在一个查询中执行此操作,还是我需要执行多个查询?
【问题讨论】:
【参考方案1】:这假设每个组最多只有 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)
【讨论】:
我在使用您的 SQL 时不断收到此错误:查询表达式中的语法错误(缺少运算符)links.groupid = groups.groupid)在(links.subgroup = subgroupd.subgroup.id)上左外连接子组) 看起来我拼错了链接名。固定。【参考方案2】: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】:您将使用外部联接:
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】: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
保持这样的表格在功能上没有区别,但好处是您只需去一个地方编辑组/子组
【讨论】:
你能解释一下你会怎么做吗?【参考方案5】:您不太清楚,但我认为您想获取所有行,包括那些在 SubGroup 表中没有对应的行。
为此,您可以使用 LEFT JOIN,如果没有匹配的行,它将获取 NULL。
【讨论】:
Prody,我可能弄错了,但我相信您必须指定一个 OUTER 连接以在没有匹配记录的情况下获取空值。您可能需要修改您的答案。 LEFT JOIN 和 LEFT OUTER JOIN 是一回事。【参考方案6】:SELECT LinkName, GroupName, SubGroupNamne
FROM Links INNER JOIN Groups ON LInks.GroupID = Groups.GroupID
LEFT JOIN SubGroup ON Links.SubGroupID = SubGroup.SubGroupID
这将包括没有子组的行。该列将简单地为 NULL。
【讨论】:
【参考方案7】: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】:好的,试试:
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 中可以)- 您需要调整第二个选择中的空格以匹配 subgroup.subgroupname 的大小。
【讨论】:
【参考方案9】:在 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
【讨论】:
【参考方案10】:只需在 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 )
应该可以的。
【讨论】:
以上是关于SQL 连接问题的主要内容,如果未能解决你的问题,请参考以下文章