Внешний ключ Относится к столбцам первичного ключа той же таблицы. - PullRequest
4 голосов
/ 02 мая 2019

У меня есть две таблицы, подобные этой:

Таблица 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

Я хочу запросить все офисы с указанием названия соответствующего родительского офиса. Но когда я попытался сделать запрос, запрос возвращает идентификатор родительского офиса вместо имени родительского офиса.

Вот запрос, который я использовал.

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 голосов
/ 02 мая 2019
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 
0 голосов
/ 02 мая 2019

Я бы подошел к этому следующим образом:

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 голосов
/ 02 мая 2019

Добавьте еще один left join с таблицей offices для подключения parent 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;
0 голосов
/ 02 мая 2019

Вы сохраняете название офиса в таблице 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...