Duplikaty wierszy w zapytaniu SQL (ORACLE)

0

Witam serdecznie,
mam problem z poniższym zapytaniem:

SELECT DISTINCT PRAC.ENAME, KIER.ENAME AS ENAME2
FROM EMP Prac INNER JOIN EMP KIER ON PRAC.DEPTNO=KIER.DEPTNO
WHERE PRAC.ENAME!=KIER.ENAME;

Zapytanie powinno wyświetlać pary pracowników, którzy pracują w tym samym dziale. Nazwiska w parze powinny być różne i nie powinny się powtarzać.

// Używając takiego zapytania zwracają mi się po dwie takie same pary, np. SMITH | JONES oraz JONES | SMITH

Będę bardzo wdzięczny za pomoc w rozwikłaniu mojego problemu.

0

To w teorii robi to o co pytasz, ale raczej źle podchodzisz do zagadnienia.

declare @EMP table (id int, ename nvarchar(100), deptNo int)
insert into @EMP values (1, 'smith', 1)
insert into @EMP values (2, 'jones', 1)
insert into @EMP values (3, 'clark', 1)
insert into @EMP values (4, 'nowak', 2)
insert into @EMP values (5, 'malinowski', 2)

select * from
(
	SELECT distinct
		id1 = case when prac.id < kier.id then prac.id else kier.id end,
		id2 = case when prac.id < kier.id then kier.id else prac.id end
	FROM @EMP Prac 
	INNER JOIN @EMP KIER ON PRAC.DEPTNO = KIER.DEPTNO
	WHERE PRAC.id != KIER.id
) as uniquePairs
inner join @emp p on uniquePairs.id1 = p.id
inner join @emp k on uniquePairs.id2 = k.id

Zakładam że kierownikiem nie jest pierwszy lepszy który się nawinie, tylko umiesz na podstawie danych w bazie (jakiejś flagi, czy innych tabel) wskazać kto jest kierownikiem w departamencie (dziale).
Więc wybierasz listę kierowników, a następnie tą listę łączysz z pozostałymi pracownikami w dziale.

 
select m.Name as Kierownik, p.Name as Pracownik 
from (select * from emp where isManager = 1) as m
inner join emp e on m.depNo = p.depNo and e.isManager = 0
0

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO


7839 KING PRESIDENT NULL 17-NOV-81 5000 NULL 10
7698 BLAKE MANAGER 7839 01-MAY-81 2850 NULL 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 NULL 10
7566 JONES MANAGER 7839 02-APR-81 2975 NULL 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7900 JAMES CLERK 7698 03-DEC-81 950 NULL 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7902 FORD ANALYST 7566 03-DEC-81 3000 NULL 20
7369 SMITH CLERK 7902 17-DEC-80 800 NULL 20
7788 SCOTT ANALYST 7566 09-DEC-82 3000 NULL 20
7876 ADAMS CLERK 7788 12-JAN-83 1100 NULL 20
7934 MILLER CLERK 7782 23-JAN-82 1300 NULL 10

Tak wygląda tabela EMP. Kierownika identyfikuję po flagach w polu MGR. Zauważ że w danym dziale nie jest tylko jeden kierownik. Np. SMITH pracuje w dziale 20 a jego kierownik to FORD, a kierownikiem FORDA jest JONES. Wszyscy z działu 20.

Czy mogę zrobić to w taki sposób jak napisałeś wyżej? Czy jest jakiś prostszy sposób na zrobienie tego, gdyż nie mam dość mocnych predyspozycji w SQL?

0

Typowe RECURSIVE CTE się kłania. Na Ora powinien być

0

Dlaczego łączysz po departamencie ? skoro chcesz (domniemam) wyświetlić podwładnych i ich kierowników. Powinieneś łączyć po :

FROM EMP Prac INNER JOIN EMP KIER ON PRAC.MGR=KIER.EmpNo

0

Tak jak napisałem w pierwszym poście MAM WYŚWIETLIĆ PARY PRACOWNIKÓW PRACUJĄCYCH W TYM SAMYM DZIALE. Stanowisko nie ma tutaj znaczenia.

Chodzi mi o to, żeby tak zmodyfikować to moje zapytanie żeby nie wyświetlały się takie same pary, które różnią się tylko kolejnością

0

OK. Poradziłem sobie.
Zmieniłem wyrażenie w klauzurze WHERE:

WHERE PRAC.ENAME<KIER.ENAME

i działa jak należy

1 użytkowników online, w tym zalogowanych: 0, gości: 1