I am querying against a SQL Server database and I’ve been struggling to get the result set I want. I feel like it is possible but I’m just unable to do it. Here is how the DB is layed out.
x
City Table:
CityID CityName StateID
------ -------- -------
1 Fairfax 1
2 Richmond 1
3 Roanoke 1
State Table:
StateID StateName StateShortName
------- --------- --------------
1 Virginia VA
Score Table:
CityID StateID Score
------ ------- -----
1 1 50
3 1 100
I’d like to return a result set that looks like this:
CityID CityName StateID StateName StateShortName Score
------ -------- ------- --------- -------------- -----
1 Fairfax 1 Virginia VA 50
2 Richmond 1 Virginia VA NULL
3 Roanoke 1 Virginia VA 100
I’ve unsuccessfully tried using CTE‘s:
;WITH CTE AS
(
SELECT DISTINCT C.CityID,
C.CityName,
S.StateID,
S.StateName,
S.StateShortName,
S.CountryID
FROM City C WITH (NOLOCK)
INNER JOIN State S WITH (NOLOCK) ON C.StateID = S.StateID
WHERE C.StateID = 4
)
SELECT SC.CityID, CTE.CityName, SC.StateID, CTE.StateName, CTE.StateShortName, SC.Score
FROM Score SC WITH (NOLOCK)
INNER JOIN CTE ON SC.StateID = CTE.CityID
ORDER BY CTE.CityID ASC
I’ve also unsuccessfully tried UNION‘s:
SELECT C.CityID,
C.CityName,
S.StateID,
S.StateName,
S.StateShortName,
CASE
WHEN SC.Score = NULL
THEN NULL
ELSE SC.Score
END AS Score
FROM Score SC WITH (NOLOCK)
INNER JOIN State S WITH (NOLOCK) ON SC.StateID = S.StateID
INNER JOIN City C WITH (NOLOCK) ON SC.CityID = C.CityID
WHERE SC.StateID = 3
UNION
SELECT C.CityID,
C.CityName,
S.StateID,
S.StateName,
S.StateShortName,
NULL AS Score
FROM City C WITH (NOLOCK)
INNER JOIN State S WITH (NOLOCK) ON C.StateID = S.StateID
WHERE S.StateID = 3
ORDER BY C.CityID ASC
Any help would be appreciated!
Advertisement
Answer
You need to LEFT JOIN
the Score table:
SELECT C.CityID,
C.CityName,
S.StateID,
S.StateName,
S.StateShortName,
SC.Score
FROM City C
INNER JOIN State S ON S.StateID = C.StateID
LEFT JOIN Score SC ON SC.StateID = S.StateID AND SC.CityID = C.CityID;