I’m using SQL Server and I’m having a difficult time trying to get the results from a SELECT query that I want. I’ve tried joining in different orders and using subqueries but nothing quite works the way I want. Take this contrived example of software applications, with different version levels, that might be installed on peoples computers.
I need to perform a JOIN with a WHERE, but for some reason I can’t get the results I want.
Maybe I’m looking at my data wrong, I’m not quite sure why I can’t get this to work.
Application table
ID Name
1 Word
2 Excel
3 Powerpoint
Software Table (contains version information for different applications)
ID ApplicationID Version
1 1 2003
2 1 2007
3 2 2003
4 2 2007
5 3 2003
6 3 2007
Software_Computer junction table
ID SoftwareID ComputerID
1 1 1
2 4 1
3 2 2
4 5 2
Computer table
ID ComputerName
1 Name1
2 Name2
I want a query that I could run where I select a specific computer to display what software version and application is has, but I also want it to display what application it does not have(the version would be a NULL since it doesn’t have that software on it)
SELECT Computer.ComputerName, Application.Name, Software.Version
FROM Computer
JOIN Software_Computer
ON Computer.ID = Software_Computer.ComputerID
JOIN Software
ON Software_Computer.SoftwareID = Software.ID
RIGHT JOIN Application
ON Application.ID = Software.ApplicationID
WHERE Computer.ID = 1
I want the following result set
ComputerName Name Version
Name1 Word 2003
Name1 Excel 2007
Name1 Powerpoint NULL
But I just get
Results
ComputerName Name Version
Name1 Word 2003
Name1 Excel 2007
I thought the RIGHT JOIN would include all the results in the application table, even if they aren’t associated with the computer. What am I missing/doing wrong?
When using
LEFT JOINorRIGHT JOIN, it makes a difference whether you put the filter in theWHEREor into theJOIN.See this answer to a similar question I wrote some time ago:
What is the difference in these two queries as getting two different result set?
In short:
WHEREclause (like you did, the results that aren’t associated with that computer are completely filtered outJOINinstead, the results that aren’t associated with that computer appear in the query result, only withNULLvalues–> this is what you want