Avatar billede misbruger Nybegynder
02. april 2003 - 11:03 Der er 21 kommentarer og
1 løsning

Slet dupliketter

Jeg har en tabel hvor der er blevet oprettet nogle duplicate data.

-----------------------
Indekz    BIGINT PK
MemberID  VARCHAR(10)
Text      VARCHAR(50)
Amount    FLOAT(8)
-----------------------

Hvordan kan jeg få slettet de poster der forkommer igen?

Altså hvis der er 2 eller flere poster med samme "MemberID" og "Tekst", så skal alle dubletter slettes?
Avatar billede stig3 Mester
02. april 2003 - 11:15 #1
Mit forslag ville være at oprette en ny tabel og hælde data'ne over i.

Du kan så bruge Distinct til af undgår at få dubletterne med.
Avatar billede stig3 Mester
02. april 2003 - 11:16 #2
Der var vist lige lovlig mange stavefejl...

Mit forslag ville være at oprette en ny tabel til at hælde data'ne over i.

Du kan så bruge Distinct til at undgå at få dubletterne med.
Avatar billede pierrehusted Nybegynder
02. april 2003 - 11:21 #3
Jeg er helt med på Stigs idé - hvis det altså er mange data.

Ellers kan du bare åbne tabellen igennem Enterprise Manager og sorterer den efter MemberID. Så kan du kigge dem igennem efter dubletter.
Avatar billede misbruger Nybegynder
02. april 2003 - 11:22 #4
Er det ikke umiddelbart et unødvendigt besvær....?
Det må være muligt at lave en procedure der håndtere samme?
Avatar billede pierrehusted Nybegynder
02. april 2003 - 11:24 #5
Problemet er at du ikke kan vide hvilke(n) at dubletterne der skal slettes hvis du har dem identificeret ved "MemberID" eller "Tekst".
Avatar billede _just4fun_ Nybegynder
02. april 2003 - 11:32 #6
pierre > Ser ud til at "MemberID" eller "Tekst" er ens, men INdekz er unikt (ellers ikk PK)

Men du kan vel lave en cursor der bøber gennem en liste af dublet-memberIDer, og sletter dem med MenberID = den cursoren står på, og Indexz > end den første

/J
Avatar billede pierrehusted Nybegynder
02. april 2003 - 11:34 #7
Ja, ok - på den måde er det vel muligt.

Lad os se et eksempel just4fun.
Avatar billede _just4fun_ Nybegynder
02. april 2003 - 11:35 #8
sitg3's forslag er også rimelig nemt... Og bagefter kan man jo bare slette indholdet i den oprindelige tabel, og flytte de tilbageblevne records tilbage i den.

(Og sætte "MemberID" og "Tekst" unikt hvis de skal være unikke!)
Avatar billede _just4fun_ Nybegynder
02. april 2003 - 11:50 #9
Jeg er lidt i tvivl om den query der finder dupletterne, men ellers skulle dette virke. (Lad være med at køre det hvis du ikke har en backup af data...)
--------------------------------
DECLARE delete_cursor CURSOR FOR
DECLARE @memberId varchar(10)
DECLARE @PK bigint
DECLARE @tkst varchar(50)
DECLARE @cnt int

-- find dupletter
SELECT distinct memberId, [Text], count(memberId) as dubcount
FROM [myTable]
WHERE dubcount > 1
group by memberId, [Text];

OPEN delete_cursor

-- Perform the first fetch.
FETCH NEXT FROM delete_cursor

-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
WHILE @@FETCH_STATUS = 0
BEGIN
  -- This is executed as long as the previous fetch succeeds.
  FETCH NEXT FROM delete_cursor
  INTO @memberId, @tkst, @CNT

  SELECT @PK = indekz from [table] where memberId=@memberId and [text]=@tkst
  delete from [table] where memberId=@memberId and [text]=@tkst
    and Indekz != @PK
END

CLOSE delete_cursor
DEALLOCATE delete_cursor
GO
---------------------------------
Avatar billede _just4fun_ Nybegynder
02. april 2003 - 11:50 #10
aaarghh:
SELECT @PK = top 1 indekz from [table] where memberId=@memberId and [text]=@tkst
Avatar billede misbruger Nybegynder
02. april 2003 - 12:43 #11
Hallo just4fun

Der er en lille ændring...
MemberId alene er ikke unik, men samfaldet mellem "MemberID og "Text" skal være unikt
Avatar billede _darkstar_ Nybegynder
02. april 2003 - 13:02 #12
just4fun>>> Nu har du da lige genopfundet et join?!?

Hvad emd

DELETE FROM mintabel WHERE indekz IN (
  SELECT t1.indekz FROM mintabel t1, mintabel t2
  WHERE t1.MemberID = t2.MemberID
    AND t1.Text = t2.Text
    AND t1.Amount = t2.Amount )

Thats it.

P.S. Som just4fun skriver: kør den kun hvis du har taget en backup først!
Avatar billede _darkstar_ Nybegynder
02. april 2003 - 13:03 #13
emd -> med
Avatar billede janus_007 Nybegynder
02. april 2003 - 13:03 #14
uhauha endnu en cursor rytter....Hold nu op med det og få styr på jeres sql istedet *GG*

CREATE TABLE [NewTable] (
    [Indekz] [BIGINT] IDENTITY (1, 1) NOT NULL ,
    [MemberID] [varchar] (50),
    [Text] [varchar] (50),
    [Amount] [varchar] (50),
    CONSTRAINT [PK_NewTable] PRIMARY KEY  CLUSTERED
    (
        [Indekz]
    )
)


INSERT INTO Newtable
SELECT DISTINCT MemberID, Text, Amount
FROM DuplicateTablename


Herefter kan du evt. bruge en  DROP TABLE DuplicateTablename og sp_rename Newtable, TableName


husk lige at skifte DuplicateTablename ud med dit tablenavn :O)
Avatar billede janus_007 Nybegynder
02. april 2003 - 13:05 #15
Ja DarkStar, den er sq næsten bedre ;O)


(men også kun næsten hehe)
Avatar billede _darkstar_ Nybegynder
02. april 2003 - 13:05 #16
Der er en hage ved min løsning: den sletter alle poster hvor der er mere end én forekomst af samme data. Mao. den sletter ikke alene "dubletterne", men også "originalerne". Det kan undgås ved at indføre en lille betingelse:

DELETE FROM mintabel WHERE indekz IN (
  SELECT t1.indekz FROM mintabel t1, mintabel t2
  WHERE t1.MemberID = t2.MemberID
    AND t1.Text = t2.Text
    AND t1.Amount = t2.Amount
    AND t1.indekz > t2.indekz )

Så skulle det gerne virke.
Avatar billede _darkstar_ Nybegynder
02. april 2003 - 13:06 #17
...vel at mærke uden at skulle oprette nye tabeller. Gnæk, janus :-)
Avatar billede _darkstar_ Nybegynder
02. april 2003 - 13:10 #18
...og hvem sagde "få styr på Jeres SQL først"?

(Mere gnæk.)
Avatar billede _just4fun_ Nybegynder
02. april 2003 - 13:42 #19
Cursorrytter :-) Den havde jeg ikke hørt før..

_dark -> sad også med den først du postede i hovedet, men kunne ikke liiige greje hvorn jeg fik den første siet fra.
Avatar billede misbruger Nybegynder
02. april 2003 - 14:13 #20
Hmmm darkstar.... det var nok lidt mere det jeg ledte efter.... prøver den lige

...efter en backup... :)
Avatar billede misbruger Nybegynder
02. april 2003 - 14:43 #21
hey darkstar smid lige et svar din ræv! Den var sku lige i øjet....
Avatar billede _darkstar_ Nybegynder
02. april 2003 - 17:32 #22
Her.
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