首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >外键是指同一表的主键列

外键是指同一表的主键列
EN

Stack Overflow用户
提问于 2019-05-02 14:49:44
回答 4查看 133关注 0票数 4

我有两个这样的表:

表1- CivilOffices

代码语言:javascript
运行
复制
Id - Primary key
OfficeId - Foreign Key - refer to Office Table
Created Date
Location 
ParentOffice - Foreign Key - refer to Office Table

表2-办公室

代码语言:javascript
运行
复制
OfficeId - Primary key
Name

我想查询所有具有各自上级办公室名称的办公室。但是当我尝试查询时,查询返回的是父办公室的id,而不是父办公室的名称。

下面是我使用的查询。

代码语言:javascript
运行
复制
SELECT O.OfficeId, O.Name, CO.ParentOffice
FROM Offices As O
LEFT JOIN CivilOffices As CO
ON O.OfficeId=CO.OfficeId;

下面是结果

代码语言:javascript
运行
复制
OfficeId | Name    | ParentOffice
---------------------------------
1        |Office1  |NULL
2        |Office2  |NULL
3        |Office3  |1
4        |Office4  |3
5        |Office5  |NULL
6        |Office6  |2

相反,我希望得到如下结果

代码语言:javascript
运行
复制
---------------------------------
OfficeId | Name    | ParentOffice
---------------------------------
1        |Office1  |NULL
2        |Office2  |NULL
3        |Office3  |Office1
4        |Office4  |Office3
5        |Office5  |NULL
6        |Office6  |Office2
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-05-02 14:58:26

我的做法如下:

代码语言:javascript
运行
复制
SELECT
    co1.OfficeId,
    o1.Name,
    o2.Name AS ParentOffice
FROM Offices o1
LEFT JOIN CivilOffices co1
    ON o1.OfficeId = co1.OfficeId
LEFT JOIN Offices o2
    ON co1.ParentOffice = o2.OfficeId;

我们在CivilOffices表上执行自连接,以将每条记录与潜在的父级进行匹配。然后,我们对Offices使用两个单独的连接,以引入办公室名称以及可能的父办公室名称。

票数 0
EN

Stack Overflow用户

发布于 2019-05-02 14:56:04

您将办公室的名称存储在Offices表中,因此您需要访问与父办公室相关的Offices记录以获取其名称。

为此,只需使用子查询从Offices表中提取父办公室的名称。如果您需要来自父办公室的更多字段,那么可以考虑使用left joining,但是对于单个字段,子查询是直接的。

代码语言:javascript
运行
复制
SELECT O.OfficeId, O.Name
  , (select O2.Name from Offices as O2 where O2.OfficeId = CO.ParentOffice) AS ParentOfficeName
FROM Offices AS O
LEFT JOIN CivilOffices AS CO ON O.OfficeId = CO.OfficeId;
票数 0
EN

Stack Overflow用户

发布于 2019-05-02 15:01:39

再添加一个带有offices表的left join来连接parent office id -

代码语言:javascript
运行
复制
SELECT O.OfficeId, O.Name, CO.ParentOffice, O1.name
FROM Offices As O
LEFT JOIN CivilOffices As CO
  ON O.OfficeId=CO.OfficeId
LEFT JOIN Offices O1
  ON O1.officeid = CO.parentoffice;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55947033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档