I have a table AMZ_EMPLOYEE_DETAILS with Employee Id, Employee Name and Supervisor1 and Supervisor 2. The Supervisors are employee itself but represented by their name.
My task was to replace the Supervisor names with their Ids.
I have used the following query to obtain the solution but it uses sub-queries and the query does look optimized. For this I have also made a dimension table with all the Id and Employee Names ,table AMZ_EMPLOYEE
SELECT S1.ID, S1.EMP_NAME, S1.SUPER_1_NEW, ZZ.ID AS SUPER_2_NEW FROM (SELECT A.ID,A.EMP_NAME,A.SUPER_1,A.SUPER_2,Z.ID AS SUPER_1_NEW FROM AMZ_EMPLOYEE_DETAILS A LEFT JOIN AMZ_EMPLOYEE Z ON A.SUPER_1 = Z.EMP_NAME ) S1 LEFT JOIN AMZ_EMPLOYEE ZZ ON S1.SUPER_2 = ZZ.EMP_NAME ORDER BY 1
The following is the expected output.
Advertisement
Answer
The logic to use two self-LEFT JOIN is correct. You don’t need to use subqueries though. Consider:
SELECT a.id, a.emp_name, a1.id, a2.id FROM amz_employee_details a LEFT JOIN amz_employee a1 ON a1.emp_name = a.super_1 LEFT JOIN amz_employee a2 ON a2.emp_name = a.super_2

