SQL-fråga. Uppdatera ett fält med en COUNT() på flera rader med JOIN..

korvgubbe

Ny medlem
Gick med
13 May 2003
Ort
Sthlm
Hoj
Versys -08
Alltså.. Hur gör man? Jag lyckas inte få till det. Jag sitter med en databas som tyvär inte är normaliserad enligt konstens alla regler och har inkonsistens i ett fält som å andra sidan inte borde existera så lägg ingen energi på att försöka få mig att ta bort fältet för det är tyvär inte ett alternativ.

Problemet.
Något förenklat sitter med något som skulle kunna likställas med följande situation.

Tabell 1 - Hojmärken
Tabel 2 - Exemplar

Tabell 1 skulle kunna se ut som följer:

MärkeID Märke Antal
1 Honda 2
2 Kawa 5
3 Yamaha 1

Tabell 2 skulle kunna se ut som såhär:
MärkeID ID RegNr
1 34 KVM123
1 36 MCL234
1 45 POP098
2 76 KMH745
2 45 MJU678
2 87 MPO120
3 95 YGT765



....Nu ser det inte ut exakt såhär men något förenklat är det här nära sanningen.

Problemet är fältet ANTAL (som förvisso inte borde existera men det är en annan diskussion)

ANTAL skall alltså innehålla antalet hojar av resp märke och som kan utläsas av tabell 2 är detta fält alltså felknullat av en eller annan anledning för vissa märken...

Jag har således en fråga som ser ut ungefär som såhär för att ta fram de felaktiga...

Select m.MärkeID, m.Antal, e.Count(e.markeid) as realCount
From Marke M
Join exemplar e on e.markeid=m.markeid
group by m.markeid, m.antal
having count(e.markeid)<>m.antal

Där får jag snyggt och prydligt ut alla felaktiga rader och "realCount" anger det egentliga antalet.

Så nu till frågan:
Hur uppdaterar jag "antal" för alla felaktiga märken med det framräknade antal som jag får ut av min fråga?

....på rikgtigt är det fler tabeller inblandade och lite where-villkor men jag skulle bara vilja veta hur jag skall utforma min update (eller hur ett sql-server-script skulle kunna utformas)
 
Korvgube! Detta borde fixa biffen:

UPDATE Marke
SET Antal=TX.RealCount
FROM Marke INNER JOIN
(Select m.MärkeID, m.Antal, e.Count(e.markeid) as realCount
From Marke M
INNER JOIN exemplar e on e.markeid=m.markeid
group by m.markeid, m.antal
having count(e.markeid)<>m.antal
) TX ON Marke.MärkeID=TX.MärkeID
 
Korvgube! Detta borde fixa biffen:

UPDATE Marke
SET Antal=TX.RealCount
FROM Marke INNER JOIN
(Select m.MärkeID, m.Antal, e.Count(e.markeid) as realCount
From Marke M
INNER JOIN exemplar e on e.markeid=m.markeid
group by m.markeid, m.antal
having count(e.markeid)<>m.antal
) TX ON Marke.MärkeID=TX.MärkeID

Tack å bock! Hade missat att subqueryn skulle ha ett eget alias så jag fick det aldrig att lira!

Edit
"on" skulle vara "where"
 
Last edited:
Nyheter
Yamaha R7-vinnarens rapport: ”Ett riktigt monster på kurviga landsvägar!”

På MC-mässan i vintras anor...

Nisse Hedlund bortgången

Den legendariske motorkonst...

En dag på dragstrippen

Efter att ha varit aktiv so...

Steve McQueens Scott Squirrel till salu

Detta Scott Flying Squirrel...

Dags för Strängnäs Bike Show!

Sista lördagen i augusti är...

Bikeweekend på Kjula denna helg

Den 22-23 augusti är det da...

Motorcycle Inferno #8

Den 5 september blir Laxhol...

Tiotusentals körde Mälaren Runt

Lördagen den 15 augusti gen...

Mälaren Runt fyller 40 år

Nu på lördagen den 15 augus...

Steve Holcombe klar för GGN!

Pressmeddelande 2026-08-10 ...

Back
Top