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
Verksamheten säkrad på Gotland Ring!

Det har varit många turer k...

Ducati Superleggera V4 Centenario – kolfiberdrömmen

Med anledning av Ducatis 10...

Yamaha Ténéré 700 World Raid provkörd och klar!

Just nu återhämtar vi oss p...

Provkörning pågår, Ténéré 700 World Raid!

Just nu är vi mitt i provkö...

Världslansering, Yamaha Ténéré 700 World Raid!

Just nu är Bike på plats på...

Scenic – navigering för dig som prioriterar vägen framför destinationen

Screenshot I samband med...

CTEK visar upp ny laddare och ”booster”

CTEK NXT 5 Nu börjar sol...

Vi provkör nya H-D-modeller

Allt om MC åkte till Malaga...

IDM tar klivet upp – EURO MOTO lanseras

EURO MOTO ersätter inte IDM...

Galfer skärper greppet om racing

Pressrelease från Galfer: ...

Back
Top