Avatar billede jang03 Nybegynder
18. marts 2007 - 15:54 Der er 18 kommentarer

Query til at tjekke om der er duplicate entries

Hej med jer

Jeg har forsøgt at lave en query som skal løbe en tabel igennem for at tjekke om der findes duplicate entries i den.

Data srtuktur:

----------------------------------
ID |  SourceId  |  DestinationId
----------------------------------
1        23            56
2        56            23
3        39            11
4        11            39
----------------------------------

Data Struktur med duplicate entry             

----------------------------------
ID |  SourceId  |  DestinationId
----------------------------------
1        23            56
2        56            23
3        39            11
4        11            39
5        39            11
6        11            39
----------------------------------

Jeg ønsker en query som skal tjekke om der findes duplicates og hvis det er muligt derefter sletter dem der findes, så data strukturen bliver "indtakt" igen.

Håber at høre fra nogen

jang03
Avatar billede arne_v Ekspert
18. marts 2007 - 16:07 #1
DELETE FROM tabel t1 WHERE id NOT IN (SELECT MAX(id) FROM tabel t2 WHERE t2.sourceid=t1.sourceid AND t2.destinationid=t1.destinationid)

VIGTIGT: HUSKE AT TESTE PÅ TEST DATA FØRST !!!!
Avatar billede jang03 Nybegynder
18. marts 2007 - 16:10 #2
hej arne_v

tak for det.

tester den lige!
Avatar billede jang03 Nybegynder
18. marts 2007 - 16:15 #3
den sletter et  felt for meget

det her er den rigtige data struktur

----------------------------------
ID |  SourceId  |  DestinationId
----------------------------------
1        23            56
2        56            23

query slettede en række:

----------------------------------
ID |  SourceId  |  DestinationId
----------------------------------
1        23            56

den skal kun slette følgende:

----------------------------------
ID |  SourceId  |  DestinationId
----------------------------------
1        23            56
2        56            23
3        56            23

:-)
Avatar billede jang03 Nybegynder
18. marts 2007 - 16:16 #4
den nederste række glemte jeg at skrive

altså:

----------------------------------
ID |  SourceId  |  DestinationId
----------------------------------
........
3        56            23
Avatar billede arne_v Ekspert
18. marts 2007 - 16:19 #5
nu er jeg ikke helt med

du vil kun have en række for givne værdier af sourceid og destinationid ? eller ?
Avatar billede jang03 Nybegynder
18. marts 2007 - 16:33 #6
nope... 2 rækker

SourceId og DestinationId består af to rækker

1        23            56
2        56            23

er gyldige

hvis en tredje række eller flere rækker findes, så skal de slettes

f.eks.:

3        56            23
4        56            23
5        23            56
6        56            23
7        23            56

er u-gyldige og skal slettes
Avatar billede arne_v Ekspert
18. marts 2007 - 16:41 #7
det gør mit forskalg vil også

bortset fra at den tager højeste id, hvis du vil have mindste id skal du
bruge MIN fremfor MAX
Avatar billede jang03 Nybegynder
18. marts 2007 - 16:47 #8
tester lige igen
Avatar billede jang03 Nybegynder
18. marts 2007 - 16:53 #9
den sletter altså for meget data arne_v

lavede følgende test:

----------------------------------
ID |  SourceId  |  DestinationId
----------------------------------
1        9            10            <<<------ Korrekt!
2        10            9              <<<------ Korrekt!
3        11            12            <<<------ Korrekt!
4        12            11            <<<------ Korrekt!
----------------------------------
5        10            9              <<<------ Forkert!
6        11            12            <<<------ Forkert!
----------------------------------

De eneste data som er tilbage efter query er kørt

----------------------------------
ID |  SourceId  |  DestinationId
----------------------------------
6        11            12
Avatar billede jang03 Nybegynder
18. marts 2007 - 16:54 #10
Kører query som du forslog:

DELETE FROM UserRelations
WHERE Id NOT IN
    (SELECT MAX(t2.Id)
        FROM UserRelations t2
        WHERE t2.SourceId = SourceId
            AND t2.DestinationId = DestinationId)
Avatar billede arne_v Ekspert
18. marts 2007 - 23:11 #11
du har jo ikke skrevet det jeg skrev !
Avatar billede arne_v Ekspert
18. marts 2007 - 23:11 #12
DELETE FROM UserRelations t1
WHERE Id NOT IN
    (SELECT MAX(t2.Id)
        FROM UserRelations t2
        WHERE t2.SourceId = t1.SourceId
            AND t2.DestinationId = t1.DestinationId)
Avatar billede arne_v Ekspert
18. marts 2007 - 23:12 #13
og hvis det er mindste id du vil beholde:

DELETE FROM UserRelations t1
WHERE Id NOT IN
    (SELECT MIN(t2.Id)
        FROM UserRelations t2
        WHERE t2.SourceId = t1.SourceId
            AND t2.DestinationId = t1.DestinationId)
Avatar billede jang03 Nybegynder
19. marts 2007 - 17:49 #14
hej igen

men jeg må ikke bruge navngivning i et DELETE statement.

Altså DELETE FROM UserRelations t1

Må du det?
Avatar billede arne_v Ekspert
19. marts 2007 - 18:11 #15
jeg har ikke testet

men så twister vi den bare lidt

DELETE
FROM UserRelations
WHERE Id NOT IN
(SELECT mid FROM (SELECT MIN(t2.Id) AS mid,SourceId,DestinationId  FROM UserRelations GROUP BY SourceId,DestinationId) x)
Avatar billede arne_v Ekspert
06. maj 2007 - 23:13 #16
all set ?
Avatar billede arne_v Ekspert
17. juni 2007 - 05:36 #17
??
Avatar billede HenrikSjang Nybegynder
08. marts 2008 - 00:05 #18
Et gammelt spørgsmål, men derfor kan den jo godt få endnu et forslag :)
Det kan klares med en CTE:

WITH Delete_CTE
AS
(
SELECT
    ROW_NUMBER() OVER (PARTITION BY SourceId, DestinationId ORDER BY ID) AS RowNumber
FROM eks2
)

DELETE FROM Delete_CTE
WHERE RowNumber > 1
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester