Empid   Deptid  Email
39  42  uni@mail.com
38  43  uni@mail.com
37  44  uni@mail.com
25  35  unique@maill.com
26  36  second@maill.com

Jak znaleźć tylko unikalny rekord? Empid -> 25 i 26.

Próbowałem poniżej zapytania.

select empid,deptid,row_number() over(PARTITION BY lower(email) Order By empid desc) from emp 
group by email,empid
0
Velu 9 luty 2018, 10:06

4 odpowiedzi

Najlepsza odpowiedź

A co z tym:

select *
from emp
where Email =any (select Email from emp group by Email having count(*) = 1);

Znalazłem również wersję bez podłączenia lub dołączenia do siebie. Przynajmniej z teorii powinna mieć najlepszą wydajność ze wszystkich.

SELECT 
    MAX(Empid) KEEP (DENSE_RANK FIRST ORDER BY NULL) AS Empid, 
    MAX(Deptid) KEEP (DENSE_RANK FIRST ORDER BY NULL) AS Deptid,
    Email
FROM emp
GROUP BY Email
HAVING COUNT(*) = 1;
3
Wernfried Domscheit 9 luty 2018, 07:50

Możesz użyć zapytania not exists, aby to zrobić:

select e1.*
from emp e1
where not exists (select *  
                  from emp e2
                  where e2.empid <> e1.empid
                    and lower(e2.email) = lower(e1.email));
1
a_horse_with_no_name 9 luty 2018, 07:10

Inna opcja:

select empid
from emp
where email in (select email 
                from emp
                group by email
                having count(*) = 1);
1
Littlefoot 9 luty 2018, 07:13
SELECT *
    FROM emp
    WHERE email IN (SELECT email FROM emp GROUP BY email HAVING COUNT(*)=1)
0
Kos 9 luty 2018, 07:43