Для начала вот фиктивная таблица, которую я сделал, чтобы показать данные, с которыми я работаю:
| работник | заглавие | разделение | Эл. адрес |
|---|---|---|---|
| Босс | босс | о | bp@email |
| Джон Смит | руководитель | а | Джос@электронная почта |
| Джейн Смит | руководитель | б | jas@email |
| Лео Месси | работник | а | lm@email |
| Аманда Кессель | работник | а | ак@электронная почта |
| Дерек Джетер | работник | б | dj@электронная почта |
Я хочу получить следующую информацию:
| работник | заглавие | разделение | Эл. адрес | имя_руководителя | supervisor_email |
|---|---|---|---|---|---|
| Босс | босс | о | bp@email | НУЛЕВОЙ | НУЛЕВОЙ |
| Джон Смит | руководитель | а | Джос@электронная почта | Босс | bp@email |
| Джейн Смит | руководитель | б | jas@email | Босс | bp@email |
| Лео Месси | работник | а | lm@email | Джон Смит | Джос@электронная почта |
| Аманда Кессель | работник | а | ак@электронная почта | Джон Смит | Джос@электронная почта |
| Дерек Джетер | работник | б | dj@электронная почта | Джейн Смит | jas@email |
Я просмотрел и попробовал документацию по адресу:
https://www.sqltutorial.org/sql-self-join/
SQL Server: отношение LEFT JOIN EMPLOYEE MANAGER
Одним из больших отличий здесь является то, что у меня нет столбца идентификатора сотрудника или менеджера, с которым можно было бы работать.
Если вы являетесь руководителем подразделения, т.е. Джон Смит является руководителем подразделения а, то вы управляете всеми сотрудниками подразделения а. При этом все начальники подчиняются начальнику отдела О, а начальник не отвечает ни перед кем.
Вот лучший код, который я пробовал до сих пор:
select e.*, b.employee as supervisor, b.email as supervisor_email
from employees e, employees b
where b.division = e.division
and
b.title like '%supervisor%'
Это приблизило меня, оно вернулось:
| работник | заглавие | разделение | Эл. адрес | имя_руководителя | supervisor_email |
|---|---|---|---|---|---|
| Джон Смит | руководитель | а | Джос@электронная почта | Джон Смит | Джос@электронная почта |
| Джейн Смит | руководитель | б | jas@email | Джейн Смит | jas@email |
| Лео Месси | работник | а | lm@email | Джон Смит | Джос@электронная почта |
| Аманда Кессель | работник | а | ак@электронная почта | Джон Смит | Джос@электронная почта |
| Дерек Джетер | работник | б | dj@электронная почта | Джейн Смит | jas@email |
Таким образом, информация о сотруднике была получена правильно, но запись о боссе была опущена, а руководители назначены их собственными руководителями. Я думаю, что мне нужен какой-то случай или оператор if здесь, но я не уверен.
Пожалуйста, дайте мне знать, если это имеет смысл или необходимы дополнительные разъяснения.
Кроме того, выработайте привычку использовать осмысленные псевдонимы. e для employee и m для менеджера employee сделают далеко лучшим выбором для псевдонимов. Вредные привычки, от которых следует избавиться: использование псевдонимов таблиц, таких как (a, b, c) или (t1, t2, t3)
Хорошо, конечно, я все еще изучаю SQL, поэтому я не знал, что синтаксис такой старый. Спасибо за гиперссылку, почитаю.
Если вы изучаете этот синтаксис из материала, который читаете, @Seth, то пришло время найти другой материал.


Вы можете попробовать использовать LEFT JOIN и работать с двумя условиями:
employee < supervisorsupervisor < bossВот как я это сделал:
SELECT t1.*,
t2.employee,
t2.email
FROM tab t1
LEFT JOIN tab t2
ON (t1.division = t2.division AND
t2.title = 'supervisor' AND
t1.title = 'employee')
OR (t2.title = 'boss' AND
t1.title = 'supervisor')
Вы найдете скрипку SQL здесь.
Это сработало - я не знал, что вы можете сделать оператор ON с таким предложением OR. Благодарю вас!
Да, вы можете делать более сложные/сложные вещи, используя операнды, отличные от = (например, вы можете сделать t1.division > t2.division). Рад, что помог.
Если вы хотите обновить текущую таблицу (если столбцы доступны), вы можете сделать следующее (более или менее так же, как @lemon):
UPDATE testing t1 JOIN testing t2 ON t2.`division`=t1.division OR t2.division = "o" SET
t1.supervisor_name=t2.`employee`, t1.supervisor_email=t2.email
WHERE (CASE
WHEN t1.`title` = "employee" THEN t2.title = "supervisor"
WHEN t1.`title` = "supervisor" THEN t2.title = "boss"
END);
SELECT * FROM testing;
Вы не мочь выполняете
LEFT JOINс синтаксисомJOIN1980-х; он устарел в SQL Server 2008 и удален в SQL Server 2012; пора влиться в 90-е. Плохие привычки, от которых нужно избавиться: использование JOIN в старом стиле