Avatar billede lundsfryd Nybegynder
08. august 2001 - 17:02 Der er 19 kommentarer

Sammenfletning af tabeller

Hej

Jeg har flg. tabeller (fiktivt eksempel):

Tabel 1:

Id Navn Antal
--------------
1  Hans 2
2  Jens 5

Tabel2:

Id Navn Antal
--------------
1  Egon 7
2  Hans 9

Jeg vil gerne have flettet tabel 2 ind i tabel 1, således, at tabel 1 får flg. indhold:

Id Navn Antal
--------------
1  Hans 11
2  Jens 5
3  Egon 7

Hvis et navn eksisterer i tabel 2, men ikke i tabel 1, *tilføjes* det ganske enkelt til tabel 1 sammen med antal (svarer til \"Egon\" i eksemplet).

Hvis et navn eksisterer i både tabel 1 og 2, *opdateres* blot navnets antal i tabel 1 (det nye antal lægges oven i det gamle). Svarer til \"Hans\" i eksemplet.

Jeg kan selvfølgelig godt lave dette på klienten ved at selecte, chekke, opdatere, indsætte osv... men jeg vil gerne have mysql til at klare det hele selv.

To ting er vigtige:
- Posterne i tabel 1 skal beholde deres Id (Hans skal altid være 1 osv.)
- God performance er altafgørende; hastigheden skal helst være acceptabel, selv ved en million poster eller mere.

Svaret kan evt. indeholde tips til opbygning af relevante index\'er, der vil øge performance.
Avatar billede euroman28 Nybegynder
08. august 2001 - 17:21 #1
Ja eksperten har altid været god for billig arbejdskraft :)
Avatar billede lundsfryd Nybegynder
08. august 2001 - 17:25 #2
euroman28 >> Hvad mener du? Hvordan adskiller mit spørgsmål sig fra alle andre?
Avatar billede euroman28 Nybegynder
08. august 2001 - 17:27 #3
Det gør det da heller ikke.
Det var bare min første tanke da jeg læste spørgsmålet.
Da der jo er tale om mere benarbejde end problemløsning.
Men ok..det er helt efter reglerne.
Avatar billede lundsfryd Nybegynder
08. august 2001 - 17:37 #4
Jeg ser det som problemløsning - det er ikke et eller andet stort, færdigt system jeg efterspørger; blot et par tips til SQL\'en, så jeg (og forhåbentlig andre, der står i samme situation) kan komme ud af den baglås, jeg er havnet i med det her problem.

Men du har da ret - det er er seriøst spørgsmål, og jeg håber også på et seriøst svar (derfor har jeg sat relativt mange points på).
Avatar billede euroman28 Nybegynder
08. august 2001 - 17:54 #5
Jeg ville gøre det på følgende måde.

1. Lave en SELECT COUNT(navn) FROM tabel1 WHERE navn=\'Hans\'

2. Derefter ville jeg lave 2 forskellige SQL-statements ud fra om \'Hans\' findes eller ej. En til addnew og en til update.
Avatar billede lundsfryd Nybegynder
08. august 2001 - 18:02 #6
Der er den slags, jeg har siddet og rodet lidt med - der er nogle problemer i det: Det kræver, at man har trukket navnene ud (man skal jo f.eks. vide, at der er en, der hedder Hans). Dette kan løses med en GROUP BY, men den er nok for langsom. Det samme gælder i øvrigt en COUNT på f.eks. en million rows.

De to næste statements er OK, men hele strukturen skal smides ind i en løkke (køres for hvert navn).

Alt dette gør, at man er nødt til at styre det fra klienten (udtræk af navne -> generering af SELECT-statement, alt inde i en lang løkke).

Jeg tror, at det, vi skal have fat i, er, at alt styres af mysql-serveren (dvs. klienten står kun for at køre et (lavt) antal faste SQL-statements).

Men hvis du har andre forslag/modargumenter, vil jeg da gerne høre det :-)
Avatar billede lundsfryd Nybegynder
08. august 2001 - 18:04 #7
Det var i øvrigt derfor, at jeg skrev:
\"Jeg kan selvfølgelig godt lave dette på klienten ved at selecte, chekke, opdatere, indsætte osv...\"

;-)
Avatar billede euroman28 Nybegynder
08. august 2001 - 18:33 #8
Jeg arbejder normalt med ASP, så med klient forstod jeg \'noget som ikke bliver eksekveret på serveren\'
Select chekke opdatere køres alt sammen på serveren.

anyway, jeg forstår problematikken og jeg er næsten sikker på at det kan lade sig gøre i ren SQL...den vil jeg gå og grunde lidt over.
Avatar billede euroman28 Nybegynder
08. august 2001 - 18:36 #9
Er det både tabel1 og tabel2 der kan blive op til 1 mill records ?
Avatar billede lundsfryd Nybegynder
08. august 2001 - 19:05 #10
Det er tabel1, der potentielt er størst (en million eller mere) - tabel2 har vel et max på omkring 100.000 (hvilket selvfølgelig også er en del).
Avatar billede lundsfryd Nybegynder
08. august 2001 - 19:13 #11
Ang. klient/server - vi mener det samme, jeg udtrykker det nok bare forkert. Det, jeg mener med at det køres fra klienten er, at f.eks. generering af en statement, hvor der står \"WHERE navn=\'Hans\'\" eller hvor kontrolstrukturer som f.eks. løkker bruges til at styre noget af processen.
Avatar billede euroman28 Nybegynder
08. august 2001 - 21:26 #12
Jeg er selv ny i SQL\'ens fagre verden, så den bliver nok lidt sej.

Men spændende spørgsmål, når man lige forstår det :)
Avatar billede proaccess Nybegynder
09. august 2001 - 07:35 #13
Følgende virker i Access:

UPDATE Tabel2 LEFT JOIN Tabel1 ON Tabel2.Navn = Tabel1.Navn SET Tabel1.Navn = [Tabel2].[Navn], Tabel1.Antal = [Tabel1].[Antal]+[Tabel2].[Antal];

Du skal så bare være opmærksom på at Navn er unikt !!!  (Da der jo sammentælles for alle records med fx Hans)
Avatar billede lundsfryd Nybegynder
09. august 2001 - 14:42 #14
proaccess >> jeg er bange for, at det ikke virker (mener bestemt, at LEFT JOIN på updates ikke er muligt i MySQL) - men jeg vil da få det prøvet i en fart :)
Avatar billede lundsfryd Nybegynder
09. august 2001 - 14:52 #15
Det virkede ikke :-(
Avatar billede proaccess Nybegynder
10. august 2001 - 07:27 #16
Så må vi bare dele det op...

1)  UPDATE Tabel1 INNER JOIN Tabel2 ON Tabel1.Navn = Tabel2.Navn SET Tabel1.Antal = [Tabel1].[Antal]+[Tabel2].[Antal];
2)  INSERT INTO Tabel1 ( Navn, Antal ) SELECT Tabel2.Navn, Tabel2.Antal FROM Tabel2 LEFT JOIN Tabel1 ON Tabel2.Navn = Tabel1.Navn WHERE (((Tabel1.Navn) Is Null));
3)  DELETE Tabel2.* FROM Tabel2;

Forklaring:
1 - lægger x antal til eksisterende navne
2 - tilføjer nye navne med antal
3 - tømmer tabel2
Avatar billede lundsfryd Nybegynder
10. august 2001 - 20:43 #17
Jeg har netop selv eksperimenteret med noget lignende - jeg vender lige tilbage om lidt :)
Avatar billede lundsfryd Nybegynder
11. august 2001 - 00:35 #18
proaccess >> problemet med dine eksempler er, at de bærer præg af ikke at være lavet til mysql. De virker ikke, da mysql ikke understøtter bl.a. JOINsne på tabellerne og henvisninger til flere tabeller i updates.
Avatar billede proaccess Nybegynder
13. august 2001 - 09:02 #19
lundsfryd >> du har fuldstændig ret, jeg arbejder normalt i Access, men det sidste forslag, jeg kom med, er da vist temmelig standard SQL... MEN desværre heller ikke godt nok til MySQL...
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