Avatar billede dd_ns Nybegynder
25. april 2003 - 08:46 Der er 15 kommentarer

compare...

Jeg har 2 tabeller.

tabel_1
tabel_2

jeg skal så gøre følgende.:


1. hvis et entry findes i tabel_2 så skal field "peter" have 1

2. hvis et entry findes 2 eller flere gange skal field "peter" have 2

3. hvis et entry ikke findes i tabel_2 skal field "peter" have 3

der efter skal alle dem der har field "peter" som 2 eller 3 ned i en txt fil...


Hvordan laves det lige.

Jeg har laves noget i vb, men det tager 23 timer.

Der er over 200000 entrys i tabel_1 og de skal op mod ca. 130000 i tabel_2


Data kommer fra SQL
Avatar billede venne Nybegynder
25. april 2003 - 08:50 #1
Du skal nok lige forklare det lidt bedre. Hvordan ser tabellerne ud, hvad er det for et entry der skal findes og hvad er "peter"?

/venne
Avatar billede dd_ns Nybegynder
25. april 2003 - 08:55 #2
okay... sorry...

Jeg har 2 tabeller.

tabel_1 og tabel_2

i begge tabeller er der 3 field's


id (int 4)
str_string (nvarchar 4000)
str_error (int 4)


Jeg skal så bruge følgende...

f.eks:

if table_1.str_string = table_2.str_string then table_1.str_error = 1

Men hvis table_1.str_error allerede er 1 så skal den ændres til 2


Forstår du det nu?


Den skal så løbe det hele igennem, men man skal lige huske at der er 200000 poster i table_1 og ca. 130000 i table_2
Avatar billede venne Nybegynder
25. april 2003 - 09:30 #3
Jeg gætter på at du vil finde de strenge i tabel_1 som ikke forekommer i tabel_2 eller som forekommer mere end én gang.
Hvis det er det, så prøv denne forespørgsel:

SELECT *
FROM tabel_1
WHERE (SELECT COUNT(*) FROM tabel_2
      WHERE tabel_1.str_string = tabel_2.str_string) <> 1
Avatar billede dd_ns Nybegynder
25. april 2003 - 10:18 #4
Den siger at objected ikke findes, men det gør det...
Avatar billede venne Nybegynder
25. april 2003 - 13:33 #5
Hvilket object? Hvad siger den?
Avatar billede dd_ns Nybegynder
28. april 2003 - 08:01 #6
Sorry, det var mig der ikke havde valgt den rigtige database...

Men jeg tror at det tager for langtid... Hvad kan jeg gøre for at få den til at køre hurtigere.... Lave et index på den, eller? Vi skal jo huske på at det er 120000 med 200000 entrys der skal snakke sammen her....
Avatar billede dd_ns Nybegynder
28. april 2003 - 08:06 #7
Se lige den her:

SELECT *
FROM testtable
WHERE (SELECT COUNT(*) FROM testtable_w1
      WHERE testtable.str_string = testtable_w1.str_string) <> 1


Jeg kan næsten regne ud at den checker på om der er nogle der ikke er ens, men hvad nu (eller hvordan) hvis den også skal vise alle den der er i testtable som der IKKE er i testtable_w1?
Avatar billede venne Nybegynder
28. april 2003 - 09:10 #8
Jamen, det var også meningen at den skulle det. Den (bør) tage alle rækker i testtable, som _ikke_ forekommer præcis én gang i testtable_w1. Dvs dem der er der mere end én gang og dem der ikke er der.
Sagt på en anden måde: for hver række i testtable tæller den matchende rækker i testtable_w1 og hvis der er alt andet end ét match kommer der noget ud.

Mht index vil jeg gætte på at et index på str_string i testtable_w1 (og måske testtable) vil hjælpe. Men prøv dig frem.

/venne
Avatar billede dd_ns Nybegynder
28. april 2003 - 11:23 #9
nu har jeg lavet det sådan at hver linie har en nummer. 1,2,3,osv...

Den skal også kunne se om det der f.eks er i linie 5 er det samme i begge tabeler...? Hvordan det?
Avatar billede venne Nybegynder
28. april 2003 - 12:18 #10
Enten vokser opgaven eller også har jeg ikke forstået den endnu. Har tekstens nummer også betydning? Er det feltet 'id', som er nummeret?
Kan du ikke lave et lille eksempel med tabelindhold og ønsket resultat?
Avatar billede dd_ns Nybegynder
28. april 2003 - 12:36 #11
Det er id som du siger...

Jo:

testtable - id=25
testtable - str_string=david
testtable_w1 - id=35
testtable_w1 - str_string=david


I dette tilfælde vil david være i begge tsaeller, men siden at id er blevet ændret så skal den også med i det der kopmmer ud...

Forstår du?
Avatar billede dd_ns Nybegynder
05. maj 2003 - 11:25 #12
mere hjælp ønskes
Avatar billede venne Nybegynder
05. maj 2003 - 11:52 #13
Den havde jeg helt glemt...

Hvis strengene skal passe sammen på id kan det hele så ikke ordnes med:

SELECT *
FROM testtable LEFT JOIN testtable_w1
  ON testtable.id = testtable_w1.id
WHERE testtable_w1.str_string IS NULL
  OR testtable.str_string <> testtable_w1.str_string
Avatar billede dd_ns Nybegynder
05. maj 2003 - 12:05 #14
Jeg har muligves forklaret mig forkert... Se her...

Den skal kunne følgende....

Hvis der er noget nyt i testtable i forhold til testtable_w1 skal de vises

Hvis den samme findes mere end 1 gang i testtable skal den vises

Hvis linie 3 i testtable findes i testtable_w1 men har et andet id end i testtable_w1 skal den vises

Hvis der er nogle der findes i testtable_w1 som IKKE findes i testtable skal de vises...

Hvis de kan komme som hver deres select ville det være dejligt.

forstår du...
Avatar billede venne Nybegynder
05. maj 2003 - 13:10 #15
> Hvis der er noget nyt i testtable i forhold til testtable_w1 skal de vises

Her går jeg ud fra at det er nye strenge, uden hensyn til deres id:

SELECT *
FROM testtable
WHERE NOT EXISTS (
  SELECT * FROM testtable_w1
  WHERE testtable.str_string = testtable_w1.str_string
)


> Hvis den samme findes mere end 1 gang i testtable skal den vises

Jeg går ud fra at du mener at den samme streng findes flere gange i testtable, uden hensyn til id og uden hensyn til hvad der er i testtable_w1.
Her får du de strenge, som findes flere gange i testtable:

SELECT str_string
FROM testtable
GROUP BY str_string
HAVING COUNT(*) > 1


> Hvis linie 3 i testtable findes i testtable_w1 men har et andet id end i testtable_w1 skal den vises

Her får du alle de par hvor strengene matcher mellem tabellerne, men med forskellige id'er:

SELECT *
FROM testtable INNER JOIN testtable_w1
  ON testtable.str_string = testtable_w1.str_string
WHERE testtable.id <> testtable_w1.id


> Hvis der er nogle der findes i testtable_w1 som IKKE findes i testtable skal de vises...

Lige det omvendte af den første:

SELECT *
FROM testtable_w1
WHERE NOT EXISTS (
  SELECT * FROM testtable
  WHERE testtable.str_string = testtable_w1.str_string
)


Er det sådan noget du er ude efter?
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
Kurser inden for grundlæggende programmering

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