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
Annonceindlæg tema
Offentlig digitalisering
Fra effektivisering til digital suverænitet. Hvordan skaber det offentlige en digital fremtid med AI, sikkerhed og kontrol i centrum?
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 !!!!
18. marts 2007 - 16:10
#2
hej arne_v tak for det. tester den lige!
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 :-)
18. marts 2007 - 16:16
#4
den nederste række glemte jeg at skrive altså: ---------------------------------- ID | SourceId | DestinationId ---------------------------------- ........ 3 56 23
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 ?
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
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
18. marts 2007 - 16:47
#8
tester lige igen
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
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)
18. marts 2007 - 23:11
#11
du har jo ikke skrevet det jeg skrev !
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)
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)
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?
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)
17. juni 2007 - 05:36
#17
??
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
Computerworld tilbyder specialiserede kurser i database-management