Toon posts:

[MS-SQL] Ontdubbele van reccords geeft problemen

Pagina: 1
Acties:

Verwijderd

Topicstarter
In een tmptable van de onze database heeft zich de afgelopen maand een aantal records opgestapeld. Deze komen nooit productioneel omdat er dubbele waarde zijn ontstaan.
Ik heb de werkwijze beschreven in MS-Q 139444
http://support.microsoft....aspx?scid=kb;en-us;139444
gevolgd en strand op punt 4 "You must stop here and reconcile " Ja, nog steeds dubbele records wat nu?

[ Voor 16% gewijzigd door Verwijderd op 15-01-2004 09:37 ]


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:01

TeeDee

CQB 241

At this point, the holddups table should have unique PKs, however, this will not be the case if t1 had duplicate PKs, yet unique rows (as in the SSN example above). Verify that each key in holddups is unique, and that you do not have duplicate keys, yet unique rows. If so, you must stop here and reconcile which of the rows you wish to keep for a given duplicate key value. For example, the query:
Je moet nu dus nadenken over welke rows je wilt bewaren voor een gegeven key.

Als je precies volgt wat daar staat, lijkt me dat er niks aan de hand is. Er staan zelfs querys bij.

Heart..pumps blood.Has nothing to do with emotion! Bored


Verwijderd

Topicstarter
TeeDee schreef op 15 januari 2004 @ 09:40:
[...]

Je moet nu dus nadenken over welke rows je wilt bewaren voor een gegeven key.

Als je precies volgt wat daar staat, lijkt me dat er niks aan de hand is. Er staan zelfs querys bij.
Ik weet dat ik de dubele waarden moet verwijderen, mormaal zou ik dat met de hand doen (tot 20 rec. ofzo) maar dit zijn er meer dan 200. Zo gek ben ik dus niet, 200 rec met de hand verwijderen is geen automatiseren ;)

Verwijderd

Topicstarter
is er niemand die hier antwoord op kan geven?


Dit is een stuk Oracle code (rowid), hoe maak ik hier ms-sql van....

code:
1
2
3
4
5
6
7
8
9
select SampleDate,NodeName,firstname,lastname,DirectoryName,aliasname 
from tmpEx a
where 
rowid > 
    (SELECT min(rowid) FROM tmpEx b
    WHERE 
    a.SampleDate = b.SampleDate and
    a.NodeName = b.nodename and
    a.DirectoryName = b.DirectoryName)

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
In een nieuwe tabel dumpen die er net zo uit ziet als de bestaande tabel maar met een identity kolom, je hebt dan een unieke sleutel per record

en als de sodemieter een PK instellen voor de tabel zodat het niet weer gebeurt.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Verwijderd schreef op 16 januari 2004 @ 10:46:
... hoe maak ik hier ms-sql van....
t-sql ;)

Dump de (distinct) gegevens in een temptable zodat je ze daarna terug kan zetten in de oorspronkelijke table.

/edit: spuit 11

[ Voor 11% gewijzigd door Annie op 16-01-2004 11:02 ]

Today's subliminal thought is:


Verwijderd

Topicstarter
Ik ben er nog steeds niet uit :'(

Nu heb ik een view gemaakt van een query die perfect de dubele records weergeeft over de primary key (3recs van de 4 die de tabel lang is). Want volgens de help van M$ zou delete wel kunnen opgaan met een view, aangezien hij niets snapt van een subquery!

de subquery:
code:
1
 delete from tExemailmem T1 where Exists . . .de ..hele subquery...
delete kan niet overweg met "T1"

Waarom dan toch, weer zon "hidden feature" ofzo :(

Maar ok, nu loop ik weer vast met de melding :
code:
1
2
3
delete from DuplicateExchEmailMem

View or function 'DuplicateExchEmailMem' is not updatable because it contains aggregates.
waarbij 'DuplicateExchEmailMem' de view is.

Hoe kan ik met een delete query/subquery ontdubbelen, en als dat niet mogelijk is (waar het sterk op lijkt) hoe dan wel ???????

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 19:13

Dido

heforshe

Je zult toch echt moeten besluiten welke records je wilt houden.

1234 Piet
1234 Jan

Zijn "dubbel" omdat ze dezelfde PK hebben, maar zijn niet gelijk. Volgens dat MS-stukje zit je in deze situatie. Welke wil je houden?

Wat betekent mijn avatar?


Verwijderd

Topicstarter
Dido schreef op 11 februari 2004 @ 17:22:
Je zult toch echt moeten besluiten welke records je wilt houden.

1234 Piet
1234 Jan

Zijn "dubbel" omdat ze dezelfde PK hebben, maar zijn niet gelijk. Volgens dat MS-stukje zit je in deze situatie. Welke wil je houden?
Zoals ik heb nu heb gedaan zijn de alle dubbelen eruit. Maar er is er dus niet een gespaard, hoe zou ik dat kunnen doen op basis van willekeur of alfabet.

Verder is het mij opgevallen hoe verschrikkelijk omslachtig MS-SQL is wat betreft het bereiken van je doel. De beperkingen van Delete bijvoorbeeld, de noodzaak voor tijdelijke tabellen, kan dit ook anders?

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 19:13

Dido

heforshe

Wat voor beperkingen heb je het precies over? Het feit dat j eexact moet bepalen wat je weg wilt gooien? Dat lijkt me juist een voordeel :)

Het feit dat je met dubbele records zit en dat op moet lossen is denk ik geen zwakte van (MS)SQL :)

Wat betekent mijn avatar?


Verwijderd

Topicstarter
Dido schreef op 12 februari 2004 @ 17:30:
Wat voor beperkingen heb je het precies over? Het feit dat j eexact moet bepalen wat je weg wilt gooien? Dat lijkt me juist een voordeel :)

Het feit dat je met dubbele records zit en dat op moet lossen is denk ik geen zwakte van (MS)SQL :)
Lees mijn vorige posting eens goed, ik kan al niet van een sub-select een delete maken omdat hij het gewoon niet wil :/ (select van tableBla T1 -> naar delete ombouwen = fout op T1 )

mmhz morgen post ik wel wat meer moet nu weg.

  • cavey
  • Registratie: Augustus 2000
  • Laatst online: 17-02 19:31
Kan je het niet met een cursor oplossen?

is wel rete traag (WAAROM ZIJN CURSORS ZO TRAAG IN TRANSACT *rel rel schreeuw*)

Zo zou ik het iig doen..... hele boel selects maken om te bepalen welke records weg kunnen.
En dan door die set heen stappen met een for-lus (ofwel een cursor in T-SQL).


Ga daar maar eens naar kijken, heb niet je hele situatie gelezen over of je wel of niet al iets hebt weg gegooid, maar ehmz.......... record set bepalen wat _weg_ kan.... en daar dan door heen steppen met een cursor van "delete dat record maar, next record continue".

Ez.

  • cavey
  • Registratie: Augustus 2000
  • Laatst online: 17-02 19:31
Verwijderd schreef op 11 februari 2004 @ 17:13:
Maar ok, nu loop ik weer vast met de melding :
code:
1
2
3
delete from DuplicateExchEmailMem

View or function 'DuplicateExchEmailMem' is not updatable because it contains aggregates.
waarbij 'DuplicateExchEmailMem' de view is.

Hoe kan ik met een delete query/subquery ontdubbelen, en als dat niet mogelijk is (waar het sterk op lijkt) hoe dan wel ???????
Ehm, omdat je in die view meerdere tabellen hebt? Of ergens een toegevoegde kolom die bijvoorbeeld een telling bijhoudt? Dan kan die inderdaad niet updaten of deleten .... omdat die niet weet waar die "extra" informatie vandaan komt....

maar ehmz, zoals ik in m'n post hierboven al heb geroepen.......... cursor gebruiken om door je record set heen te lopen die bepaald heeft _welke_ records weg mogen en dan zo 1 voor 1 laten deleten?

Kost wat tijd, maar dan ben je er ook vanaf....... ik denk dat de tijd die je dan moet wachten voor de cursor klaar is, ruimschoots in het niet valt met de hoeveelheid tijd die je er nu in hebt zitten ;)

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
komakeef schreef op 13 februari 2004 @ 10:01:
(WAAROM ZIJN CURSORS ZO TRAAG IN TRANSACT *rel rel schreeuw*)
Omdat een relationele database niet bedoeld is voor procedurele code, de db is geoptimaliseerd voor set based acties.

@TS:

Waarom dump je niet alles in een nieuwe tabel zoals ik gesuggereerd heb?

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Topicstarter
P_de_B schreef op 13 februari 2004 @ 10:10:
[...]


Omdat een relationele database niet bedoeld is voor procedurele code, de db is geoptimaliseerd voor set based acties.

@TS:

Waarom dump je niet alles in een nieuwe tabel zoals ik gesuggereerd heb?
Hij moet van een tmp tabel naar productie, op de tmp staan geen pk's in productie weer wel. Dus het aanmaken van een sequence in de tmp tabel zou ook inhouden dat deze weer verwijdert moet worden voor het overzetten naar productie. Ik zie het nut er niet van in, bovendien kan ik wel een sequence toevoegen maar weet niet hoe deze weer te verwijderen. (but then again ik ben geen sql guru :-)

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Verwijderd schreef op 13 februari 2004 @ 11:14:
[...]


Hij moet van een tmp tabel naar productie, op de tmp staan geen pk's in productie weer wel. Dus het aanmaken van een sequence in de tmp tabel zou ook inhouden dat deze weer verwijdert moet worden voor het overzetten naar productie. Ik zie het nut er niet van in, bovendien kan ik wel een sequence toevoegen maar weet niet hoe deze weer te verwijderen. (but then again ik ben geen sql guru :-)
Ik dacht dat het probleem was dat er niet een PK veld was om een dubbel record te verwijderen, bijvoorbeeld

Jaap, Populierenstraat 10, Groningen
Jaap, Populierenstraat 10, Groningen

en dat het niet lukte om 1 van de twee te verwijderen, of is het juist:

1234 Jaap
1234 Piet

waarbij 1234 de key is.

Kun je een exact voorbeeld noemen? Wat is er precies dubbel?

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Topicstarter
P_de_B schreef op 13 februari 2004 @ 11:45:
[...]


Kun je een exact voorbeeld noemen? Wat is er precies dubbel?
ja hoor..

---geen pk's---------------------------------------------
Jaap, Populierenstraat 10, Groningen, HuisGroot
Jaap, Populierenstraat 10, Groningen, Schuur

De tmp database waar ik in zit te hacken.

-----------------pk----------------
Jaap, Populierenstraat 10, Groningen, HuisGroot
Jaap, Populierenstraat 10, Groningen, Schuur

Zo zit het in de productie database, als het er eenmaal "goed" inzit. Maar zoal je zit gaat dat never niet lukken zonder huisgroot/schuur ook als pk te bestempelen. overigens is dat geen optie voor ons. Dus moet een van de 2 Jaap's weg, welke maakt me ook niet uit eigenlijk.

[ Voor 6% gewijzigd door Verwijderd op 13-02-2004 14:41 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Je zult moeten moeten bepalen welke records je wilt houden, in het voorbeeld ga ik er vanuit dat je de MAX van HuistType wilt bewaren.


code:
1
2
3
4
5
6
7
8
9
10
11
12
--unieke records per naam, straat en wp selecteren
--deze bewaren in tmp tabel
SELECT Naam, Straat, Woonplaats, Max(HuisType) as Huistype
INTO #Bewaren FROM tmp
GROUP BY Naam, Straat, Woonplaats

--alle records uit tmp verwijderen
DELETE FROM tmp

--unieke records uit tijdelijke bewaren tabel weer in tmp gooien
INSERT INTO tmp (naam, straat, wp, huistype)
SELECT (naam, straat, wp, huistype) FROM #bewaren


Je zou het nog even in een transactie moeten gooien voor de zekerheid, en maak even een backup, ik heb dit uit de losse pols geschreven :)

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Topicstarter
thx voor de reacties :) ben er erg me geholpen.
Pagina: 1