Диспетчер соединения SQL из той же таблицы в строку со своими сотрудниками

Для начала вот фиктивная таблица, которую я сделал, чтобы показать данные, с которыми я работаю:

работникзаглавиеразделениеЭл. адрес
Боссбоссо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 здесь, но я не уверен.

Пожалуйста, дайте мне знать, если это имеет смысл или необходимы дополнительные разъяснения.

Вы не мочь выполняете LEFT JOIN с синтаксисом JOIN 1980-х; он устарел в SQL Server 2008 и удален в SQL Server 2012; пора влиться в 90-е. Плохие привычки, от которых нужно избавиться: использование JOIN в старом стиле

Larnu 11.05.2022 17:19

Кроме того, выработайте привычку использовать осмысленные псевдонимы. e для employee и m для менеджера employee сделают далеко лучшим выбором для псевдонимов. Вредные привычки, от которых следует избавиться: использование псевдонимов таблиц, таких как (a, b, c) или (t1, t2, t3)

Larnu 11.05.2022 17:20

Хорошо, конечно, я все еще изучаю SQL, поэтому я не знал, что синтаксис такой старый. Спасибо за гиперссылку, почитаю.

Seth 11.05.2022 17:26

Если вы изучаете этот синтаксис из материала, который читаете, @Seth, то пришло время найти другой материал.

Larnu 11.05.2022 17:31
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
4
42
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете попробовать использовать LEFT JOIN и работать с двумя условиями:

  • когда деление одинаковое и мы имеем дело с отношениями employee < supervisor
  • когда отношения supervisor < 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. Благодарю вас!

Seth 11.05.2022 17:32

Да, вы можете делать более сложные/сложные вещи, используя операнды, отличные от = (например, вы можете сделать t1.division > t2.division). Рад, что помог.

lemon 11.05.2022 17:34

Если вы хотите обновить текущую таблицу (если столбцы доступны), вы можете сделать следующее (более или менее так же, как @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;

Другие вопросы по теме