Usunięcie duplikatów niepowiązanych z inną tabelą

0

Cześć,

Nie wiem czy to zmęczenie czy co, ale mam zagwozdkę.
Mam dwie tabele [przepraszam za złe formatowanie]:

employee:

ID NAME SURNAME IDENTIFICATION        POSITION          EMAIL
1  Anna   Jopek           XXXXXXX                   Manager             [email protected]
2  Anna   Jopek           XXXXXXX                   Manager             [email protected]
3  Anna   Jopek           XXXXXXX                   Manager             [email protected]
4  Anna   Jopek           RTDDDDD                  Sprzątaczka        [email protected]
5  Beata  Mońka          RFSWERR                 Manager              [email protected]
6 Julia    Wszak           SEEEEEE                  Helpdesk             [email protected]
7 Julia    Wszak           SEEEEEE                  Helpdesk             [email protected]
8 Julia    Wszak           TTTTTTT                    Recepcja            [email protected]   

oraz

employee_details:
ID   EMPLOYEE_ID    
1             2
2             5
3             7

Potrzebuję skasować duplikaty z tabeli employee (za duplikat uważa się rekord który ma takie samo: name, surname, identification, position, email), które za razem nie są powiązane z employee_details. W przykładowych danych należy usunąć duplikaty o id : 1,3,6.
O ile wiem jak sprawdzić czy employee nie ma powiązania z employee_details to nie wiem jak zwinnie sprawdzić kwestię duplikatów. I prosiłbym Was o wsparcie :)
Baza danych to Postgres

5

Taki hint

DELETE E
    FROM [SampleDB].[dbo].[Employee] E
         INNER JOIN
    (
        SELECT *, 
               RANK() OVER(PARTITION BY firstname, 
                                        lastname, 
                                        country
               ORDER BY id) rank
        FROM [SampleDB].[dbo].[Employee]
    ) T ON E.ID = t.ID
    WHERE rank > 1;
0

@UglyMan: A dziękuje!
Tylko zastanawia mnie jedna rzecz. Trochę przekształciłem Twoje zapytanie, aby sprawdzić ile mi wykrywa dubli [oczywiście jest tych dubli o wieeele więcej niż na przykładowych danych):

Select * from db.employee emp
INNER JOIN (
SELECT *, rank() over (partition by name, surname, identification, position, email ORDER BY id)
rank from db.employee) yee on emp.id=yee.id
where rank>1

i wyszło mi że dubli jest 570

A także sprawdziłem takim zapytaniem:


Select sum(zte.duplicates) from 
(Select name, surname, identification, position, email, count (*) as duplicates
from db.employee emp
GROUP BY 1,2,3,4,5
HAVING count(*) >1
ORDER BY 1 DESC ) as zte

A tutaj co ciekawe suma wyszła 620.
I zastanawiam się czy któreś zapytanie jest złe lub źle zmodyfikowałem przykładowe zapytanie?

1
immo napisał(a):

@UglyMan: A dziękuje!

Tylko zastanawia mnie jedna rzecz. Trochę przekształciłem Twoje zapytanie, aby sprawdzić ile mi wykrywa dubli [oczywiście jest tych dubli o wieeele więcej niż na przykładowych danych):

Select * from db.employee emp
INNER JOIN (
SELECT *, rank() over (partition by name, surname, identification, position, email ORDER BY id)
rank from db.employee) yee on emp.id=yee.id
where rank>1

i wyszło mi że dubli jest 570

A także sprawdziłem takim zapytaniem:


Select sum(zte.duplicates) from 
(Select name, surname, identification, position, email, count (*) as duplicates
from db.employee emp
GROUP BY 1,2,3,4,5
HAVING count(*) >1
ORDER BY 1 DESC ) as zte

A tutaj co ciekawe suma wyszła 620.
I zastanawiam się czy któreś zapytanie jest złe lub źle zmodyfikowałem przykładowe zapytanie?

Bo w swoim zapytaniu zliczasz rekordy duplikujace i zduplikowane (czyli łącznie z tymi, które zostaną w bazie po deduplikacji) a w zapytaniu Brzydkiego człowieka - wyłącznie duplikujace (czyli tylko te, które masz zamiar usunąć)

Zmień na
Select sum(ZTE.duplicates-1) i będzie git

0

Okej, też dzięki :)
Natomiast jak tak potestowałem tą SQLke na bazie to jest pewien problem i tym problemem jest 'rank', a właściwie 'where rank>1.'
Przykład : dwa rekordy, id = 1, rank=1; id=2, rank =2. I tak napisałem, chce usunąć te duplikaty które nie są powiązane z employee_details. Przez 'where' zapytanie zwróci mi rekord o id=2, który jest powiązany z employee_details, natomiast nie jest powiązany rekord o id=1, więc pupa właściwy duplikat nie zostanie usunięty.

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