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 连接问题的主要内容,如果未能解决你的问题,请参考以下文章

java sql数据连接池的问题?

sql 数据库连接超时

SQL SERVER2000不允许远程连接问题

SQL2000 突然不能远程连接空间里面的数据库了

SQL 连接差异

一个sql连接表的问题