Den här koden ger samma resultat. Används när man vill hämta något ur en tabell och samtidigt räkna referenser i annan tabell.
FooId är alltid primary key. fält0-4 är varchar fält.
--1.
SELECT a.FooId, a.fält0, a.fält1, a.fält2, a.fält3, a.fält4
, (SELECT COUNT(*) FROM tblBar b WHERE b.BarFooId = a.FooId) AS antal
FROM tblFoo a
WHERE a.whatever = 123
ORDER BY a.datum
--2.
SELECT a.FooId, a.fält0, a.fält1, a.fält2, a.fält3, a.fält4, COUNT(b.BarFooId) AS antal
FROM tblFoo a
LEFT OUTER JOIN tblBar b ON b.BarFooId = a.FooId
WHERE a.whatever = 123
GROUP BY a.FooId, a.fält0, a.fält1, a.fält2, a.fält3, a.fält4, a.datum
ORDER BY a.datum
--3.
SELECT a.FooId, a.fält0, a.fält1, a.fält2, a.fält3, a.fält4, c.antal FROM (
SELECT ax.FooId, COUNT(b.BarFooId) AS antal
FROM tblFoo ax
LEFT OUTER JOIN tblBar b ON b.BarFooId = ax.FooId
WHERE ax.whatever = 95
GROUP BY ax.FooId
) AS c
INNER JOIN tblFoo a ON a.ActivityId = c.ActivityId
ORDER BY a.datum
När jag gjort lite tester och kollat i execution plan (query cost relative to batch) så har den visat lite varierande resultat beroende på antal rader och index/inget index.
Den första verkar vara bra när det är lite data, men riktigt dålig när det är mycket data och det inte finns något index. Har den däremot index på BarFooId så ligger den bra till.
Den andra verkar vara ganska bra när det är lite data. Sämre dock när det är mer och index verkar inte påverka.
Den tredje är långsammast vid lite data, men aningen snabbare än ettan vid mycket data. Index verkar inte påverka.
Stämmer det jag skriver? Kan man lite på Query cost i Execution plan i SQL Server (7)?
Och slutligen, vad bör man ta för vana att använda?
