У меня есть две таблицы, как это:
Таблица 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 ответа
Я хотел бы подойти к этому следующим образом:
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
для ввода названия офиса, а также, возможно, названия родительского офиса, если последний существует.
Добавьте еще одну 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;
Вы сохраняете название офиса в таблице 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;
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
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.