webForumDet fria alternativet

Söka efter dubletter

16 svar · 650 visningar · startad av devotion

devotionMedlem sedan jan. 20012 711 inlägg
#1

:e
Hej!

Kan man på något sätt göra en sql-fråga som gör en sökning efter dubletter i databastabellen och presenterar dessa?

Jag har ett uppdragsprogram som använder handdatorer och ibland så gör användaren fel så det skapas dubletter av tiderna. Dubletterna har INTE samma ID men i övrigt så är det identiska

Jag skulle vilja söka ut de poster som har samma datum/tid och uppdragsnummer...

Använder access

Mvh

Henrik

LarsGMedlem sedan dec. 200012 465 inlägg
#2
select * 
from t as q
where exists 
(select 1
  from t
  where t.updNumber = q.updNumber
   and t.dateTimeValue = q.dateTimeValue
  group by t.updNumber,t.dateTimeValue 
   having count(*) > 1)
devotionMedlem sedan jan. 20012 711 inlägg
#3

Det är ju fantastiskt....

Det finns lösningar för allt...

Ska testa!

Tack så länge...

/Henrik

LaspMedlem sedan juli 200010 197 inlägg
#4

Tänk den dagen när LarsG kommer ut med sin formelsamling ;-)
Vilken källa till lösningar.
Hur kan vi hjälpa till?

devotionMedlem sedan jan. 20012 711 inlägg
#5

Hmmmm...

Nu blev det så där svårt igen...

Hur innerjoinar jag tblTask med tblTime

Tabellen "t" i LarsG´s svar ska joinas

Hur får jag in den här raden?

INNER JOIN tblTime ON tblTask.Id = tblTime.TaskId

Henrik

LarsGMedlem sedan dec. 200012 465 inlägg
#6

Två tabeller?

Beskriv hur tabellerna är definierade och ge exempel på datainnehåll.

devotionMedlem sedan jan. 20012 711 inlägg
#7

kommer....

devotionMedlem sedan jan. 20012 711 inlägg
#8

Jo så här är det....

En tabell innehåller uppdragen; tblTask. En annan innehåller tiderna; tblTime. Dessa två tabeller kopplas ihop med: tblTask.Id = tblTime.TaskId

Problemet är att ibland så registreras det dubletter på tiderna när montörerna synkar handdatorerna fel...
"Dubletterna" hamnar i tblTime.

tblTime har innehåller fälten startDate och stopDate som är av central betydelse
tblTask innehåller TaskNr som definerar vilket uppdrag det handlar om...

så jag vill göra en jämförelse om startDate, stopDate och TaskNr är lika.. Är det de så ska de listas för att kunna spåra dubletter...

Hoppas det klarnar...

Henrik

devotionMedlem sedan jan. 20012 711 inlägg
#9

Bumbeti...

mvh
Henrik

LarsGMedlem sedan dec. 200012 465 inlägg
#10
select * 
from tbltask
where id
in (select taskId 
  from tblTime
  group by startDate, stopDate,TaskId
  having count(*) > 1)
devotionMedlem sedan jan. 20012 711 inlägg
#11

ok!

Men, behöver jag inte joina då?

//Henrik

devotionMedlem sedan jan. 20012 711 inlägg
#12

Hej!
Det funkar ju fint såvida att de uppdrag som har dubletter listas (dvs från tblTask) Det går ju sedan att spåra tiderna i tblTime.

Men jag vill ju att de tider som är dubbla ska listas, dvs från tblTime...

Tanken är ju att jag ska radera dubletterna (dvs tiderna), och då är det ju lättare att göra det om frågan visar innehållet från tblTime.

Jag undrar också om det inte är nödvändigt att joina tblTime med tblTask. Jag behöver ju info om vilket uppdragsnummer som tiden tillhör, och den infon finns ju i tblTask.

Efter lite utökning av kriterier ser frågan ut så här:

select * 
from tbltask
where id
in (select taskId 
  from tblTime
  group by startDate, stopDate,TaskId, user, spec, time
  having count(*) > 1)

Har provkört i Access

Tack för all hjälp....

Mvh
Henrik

LarsGMedlem sedan dec. 200012 465 inlägg
#13

Då är allt mycket enklare om jag förstår rätt

select startDate, stopDate,TaskId, user, spec, time
  from tblTime
  group by startDate, stopDate,TaskId, user, spec, time
  having count(*) > 1
devotionMedlem sedan jan. 20012 711 inlägg
#14

Jo, det funkar finfint....
Men jag vill även ha med lite data från tblTask i resultatet. tex taskNr, så man vet till vilket uppdrag tiden hör.

tblTime.TaskId = tblTask.Id

Har provat att joina men får inte till det...

//Henrik

devotionMedlem sedan jan. 20012 711 inlägg
#15

Oj då....

Hade joinat tabellerna fel.... :r

Nu funkar det med den här koden... (tror jag...)

SELECT tblTime.StartDate, tblTime.StopDate, tblTime.TaskId, tblTime.User, tblTime.Spec, tblTime.Time, tblTask.TaskNr, tblTask.Status
FROM tblTask INNER JOIN tblTime ON tblTask.Id = tblTime.TaskId
GROUP BY tblTime.StartDate, tblTime.StopDate, tblTime.TaskId, tblTime.User, tblTime.Spec, tblTime.Time, tblTask.TaskNr, tblTask.Status
HAVING Count(*)>1

Tack LarsG...

Har du synpunkter på min lösning får du gärna skriva det... Jag vill ju det ska bli så bra som möjligt!

Mvh
Henrik

devotionMedlem sedan jan. 20012 711 inlägg
#16

Hej!
Jag har testat frågan nu och det fungerar utan några problem...

Nu är det ju så att 1 post visas där det finns dubletter. Men vet dvs inte om hur många dubletter det finns utan bara att det finns en eller flera dubletter..

Kan man inte modifiera frågan så att ALLA dubletter visas... Då kan man ju mha tex asp klicka på den man vill ta bort?

Det som är unikt för varje "dublettpost" är tblTime.Id

..och jag använder Access.

Mvh
henrik

devotionMedlem sedan jan. 20012 711 inlägg
#17

Hej!

Jag valde en annan lösning på problemet...

Här kommer lösningen:

Först koden som LarsG hjälpt till med. Den identifierar alla tider som har dubletter och listar dom

"SELECT tblTime.StartDate, tblTime.StopDate, tblTime.TaskId, tblTime.User, tblTime.Spec, tblTime.Time, tblTask.TaskNr, tblTask.Status " &_
		 "FROM tblTask INNER JOIN tblTime ON tblTask.Id = tblTime.TaskId " &_
		 "GROUP BY tblTime.StartDate, tblTime.StopDate, tblTime.TaskId, tblTime.User, tblTime.Spec, tblTime.Time, tblTask.TaskNr, tblTask.Status " &_
		 "HAVING Count(*)>1"

Datat listas i en tabell där TaskId blir klickbar. Klickas det på taskId så kommer man vidare till en annan sida som listar ALLA dubletter på aktuellt taskId.

"SELECT tblTime.StartDate, tblTime.StopDate, tblTime.TaskId, tblTime.User, tblTime.Spec, tblTime.Time, tblTask.TaskNr, tblTask.Status, tblTime.Id " &_
		 "FROM tblTask " &_
		 "INNER JOIN tblTime ON tblTask.Id = tblTime.TaskId " &_
		 "WHERE tblTime.TaskId = " & strTaskId & " AND tblTime.USER = '" & strUser & "' AND tbltime.startDate = #" & dtStartDate & "# AND tblTime.stopDate = #" & dtStopdate & "# " &_
		 "ORDER By tblTime.startDate"

Här kan man sedan lätt plocka bort dubletten

strSQL="DELETE FROM tblTime WHERE Id = " & strTimeId & ""

Så, då var detta löst.... :birp

Tack för all hjälp!

Mvh
Henrik

130 ms totalt · 3 externa anrop · cache AV · v20260731051352-full.56cc9887
0 ms — hämta statistik (cache)
0 ms — hämta forumlista (cache)
128 ms — hämta tråd, inlägg och bilagor (db)