SQL udvidet "NOT IN" query

Tags:    sql

<< < 123 > >>
Jeg har en opgave hvor jeg har 2 tabeller hvori der er en masse rækker som sagtens kan være dubletter.

opgaven går på dette.:

jeg har fx. 5 linjer fra table1

10001
10002
10001
10004
10005

som det ses er der i denne 1 dublet "10001" men denne skal behandles som værende unik...

i table 2 har jeg:

10001
10002
10004
10005

et resultat af en "NOT IN" kørsel vil i dette scenarie være tomt. men jeg har brug for at den viser at der rent faktisk er 1 række fra table1 som ikke er i table2 (10001)

værdien er der i table2, men den er allerede brugt 1 gang på den første "10001"

jeg gætter på at jeg på en eller anden måde skal lave en query hvor den kun bruger 1 række en gang og så går videre kronologisk...

jeg ved ikke om det overhovedet giver mening som jeg har forklaret det, ellers må i lige skrive...





22 svar postet i denne tråd vises herunder
5 indlæg har modtaget i alt 1 karma
Sorter efter stemmer Sorter efter dato
jeg har faktisk fundet løsningen ved hjælp af nedenstående kode.

det lykkedes ved at jeg tilføjede en index kolonne med unikt nummer til hver linje, og ligeledes en kolonne jeg kunne bruge til "used 0/1"

ikke at det er den pæneste løsning, men jeg har testet den og den virker fejlfrit, den gennemføres på cirka 1 minut hvilket er helt fint da det er en yderst sjælden kørsel, den spare dog en person for at skulle bruge 3 timer af sit liv på det hver gang det skal laves :-)

Fold kodeboks ind/udPHP kode 




Indlæg senest redigeret d. 18.10.2011 17:40 af Bruger #5395
Jeg tror du er nødt til at vende dit problem lidt rundt...

Gruppér dine værdier (GROUP BY), udvælg værdi + COUNT(*):

Fold kodeboks ind/udSQL kode 


Dette skulle gerne lave følgende liste:

Fold kodeboks ind/udKode 


Som kort sagt siger at 10001 findes én gang mere i table1 end i table2.

Jeg er lidt usikker på hvorledes forskellige query optimisers kan optimere eksekveringsplanen for dette, men nu ved jeg ikke hvor stort et datasæt du arbejder på. Anyways, det burde virke



Indlæg senest redigeret d. 13.10.2011 17:25 af Bruger #714
Jeg tror ikke det kan løses ved en sql query, da du vil alle joins vil have en dublet. Jeg tror du skal tilgå det enten med en cursor eller via kode. Som jeg forstår dig vil du "tælle kronologisk", dvs, tallet 1001 kan forekomme flere gange i tabel i, og det skal "svares" på det via tabel 2,

Jeg kan ikke lige se at det kan løses via sql, måske via en cursor, men tror så det er nemmere at lave noget kode.



Ok, du kan måske simplificere det ved at lave et view. Det er en "kunstig" tabel, som viser resultatet af et query. F.eks. en gruppering på dit "ikke-helt-unikke" tal og antallet af forekomster.
Derefter kan man søge i dette view og lave joins til andre tabeller.

Hvis du viser strukturen på de to tabeller kan vi nok hjælpe dig lidt mere.



Sådan :)

Hvis performance nogensinde bliver et problem så kan følgende queries godt laves om til en (ser det ud til):

Fold kodeboks ind/udSQL kode 


Her skal du have fat i nogle inner joins - men se på det hvis det nogensinde bliver et problem.



Hej Kaare, det vil jeg prøve at kigge på... evt. kan jeg også bruge en løsning ved at udlæse begge tabeller og så behandle det i php...

der er cirka 10.000 rækker i hver tabel...

dog er det en meget sjælden men vigtig kørsel, så det gør ikke noget at denne tager lang tid at eksekvere...





Det lyder lidt som om, der er en fejl i designet.



Databasen bør være hurtigere til at lave udregningen end hvad du kan lave i php - jeg vil stærkt anbefale at få løst problemet direkte i databasen med en query alla den jeg foreslog



Tak for minus.
Men jeg holder stadig på, at det er et design issue, som sandsynligvis kan løses mere elegant ved at ændre i strukturen istedet for brute force.



Tak for minus.
Men jeg holder stadig på, at det er et design issue, som sandsynligvis kan løses mere elegant ved at ændre i strukturen istedet for brute force.


Men det var jo ikke det der var hans problem/spørgsmål. Dit svar hjalp intet, og var direkte overflødigt.



<< < 123 > >>
t