I'm trying to make a list of employees working in a same department like:
employeeName | department | employeeName |
---|---|---|
Tim | 2 | kim |
Tim | 2 | Jim |
Kim | 2 | Tim |
Kim | 2 | Jim |
Jim | 2 | Kim |
Jim | 2 | Tim |
Aim | 3 | Sim |
Sim | 3 | Aim |
But the only thing i can do for now is:
SELECT emp_name, dept_code
FROM employee
WHERE dept_code IN (SELECT dept_code FROM employee);
employeeName | department |
---|---|
Tim | 2 |
Kim | 2 |
Jim | 2 |
Aim | 3 |
Sim | 3 |
How can I make a list pairing with the employee working in a same department? thanks gurus...
CodePudding user response:
To first point that out: I dislike your idea to create such a result listing "pairs" twice and would prefer another, easier query whose results would be better to read. I will come back to this later in this answer.
But anyway, if you really want to produce the outcome you have shown, we can do this with CROSS JOIN
. This builds all combinations of employees.
In the WHERE
clause, we will set the conditions that they must work in the same department, but have different names:
SELECT
e1.emp_name AS employeeName,
e1.dept_code AS department,
e2.emp_name AS employeeName
FROM
employee e1
CROSS JOIN employee e2
WHERE
e1.dept_code = e2.dept_code
AND e1.emp_name <> e2.emp_name
ORDER BY e1.dept_code, e1.emp_name, e2.emp_name;
To come back to the idea to make this much easier and better to read: We can just use LISTAGG
with GROUP BY
to produce a comma-separated list of employees per department. I highly recommend to use this approach due to much better performance and readability.
This query will do on new Oracle DB's:
SELECT dept_code,
LISTAGG (emp_name,',') AS employees
FROM employee
GROUP BY dept_code;
On older Oracle DB's, we need to add a WITHIN GROUP
clause:
SELECT dept_code,
LISTAGG (emp_name,',')
WITHIN GROUP (ORDER BY emp_name) AS employees
FROM employee
GROUP BY dept_code;
This will produce following result for your sample data:
DEPT_CODE | EMPLOYEES |
---|---|
2 | Jim,Kim,Tim |
3 | Aim,Sim |
Here we can try out these things: db<>fiddle
CodePudding user response:
You will get all the pairs (A,B) and (B,A) of employees in the same department at the exclusion of all (A,A) with:
SELECT e1.emp_name AS first_emp_name, e1.dept_code, e2.emp_name AS second_emp_name
FROM employee e1
JOIN employee e2 ON e1.dept_code = e2.dept_code AND e1.emp_name <> e2.emp_name ;