外键引用同一表的主键列

时间:2019-05-02 06:49:44

标签: sql sql-server tsql

我有两个这样的表:

表1-CivilOffices

Id - Primary key
OfficeId - Foreign Key - refer to Office Table
Created Date
Location 
ParentOffice - Foreign Key - refer to Office Table

表2-办公室

OfficeId - Primary key
Name

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

这是我使用的查询。

SELECT O.OfficeId, O.Name, CO.ParentOffice
FROM Offices As O
LEFT JOIN CivilOffices As CO
ON O.OfficeId=CO.OfficeId;

这是结果

OfficeId | Name    | ParentOffice
---------------------------------
1        |Office1  |NULL
2        |Office2  |NULL
3        |Office3  |1
4        |Office4  |3
5        |Office5  |NULL
6        |Office6  |2

相反,我希望得到这样的结果

---------------------------------
OfficeId | Name    | ParentOffice
---------------------------------
1        |Office1  |NULL
2        |Office2  |NULL
3        |Office3  |Office1
4        |Office4  |Office3
5        |Office5  |NULL
6        |Office6  |Office2

4 个答案:

答案 0 :(得分:0)

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

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

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;

答案 1 :(得分:0)

我将按以下方式进行处理:

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使用两个单独的联接,以引入办公室名称以及可能存在的父办公室名称。

答案 2 :(得分:0)

通过left join表再添加一个officesparent office id-

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;

答案 3 :(得分:0)

SELECT o.OfficeId
    ,  o.Name 
    ,  c.ParentOffice 
FROM Offices o
INNER JOIN CivilOffices co ON O.OfficeId = CO.OfficeId
OUTER APPLY 
            (
            SELECT o1.Name AS ParentOfficeName 
                ,  co1.ParentOffice 
            FROM Offices o1
            INNER JOIN CivilOffices co1 ON O.OfficeId = CO.ParentOffice
            WHERE O.OfficeId = CO1.ParentOffice
            ) c