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

Таблица 1 - Гражданские офисы

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
Areef Ahmed 2 Май 2019 в 09:49

4 ответа

Лучший ответ

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

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
Tim Biegeleisen 2 Май 2019 в 07:08

Добавьте еще одну 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
Dale K 2 Май 2019 в 07:02

Вы сохраняете название офиса в таблице 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;
0
Dale K 2 Май 2019 в 07:29
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
M.Ali 2 Май 2019 в 07:06