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.
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;