Sto*_*hao 16 sql-server join where
我正在使用SQL Server,我很难尝试从SELECT我想要的查询中获取结果.我尝试过加入不同的命令并使用子查询,但没有什么能按我想要的方式工作.以这个人为计算机上可能安装的具有不同版本级别的软件应用程序为例.
我需要执行JOIN一个WHERE,但由于某些原因,我不能得到我想要的结果.
也许我正在查看我的数据错误,我不太清楚为什么我不能让它工作.
申请表
ID Name
1 Word
2 Excel
3 Powerpoint
Run Code Online (Sandbox Code Playgroud)
软件表(包含不同应用程序的版本信息)
ID ApplicationID Version
1 1 2003
2 1 2007
3 2 2003
4 2 2007
5 3 2003
6 3 2007
Run Code Online (Sandbox Code Playgroud)
Software_Computer连接表
ID SoftwareID ComputerID
1 1 1
2 4 1
3 2 2
4 5 2
Run Code Online (Sandbox Code Playgroud)
电脑桌
ID ComputerName
1 Name1
2 Name2
Run Code Online (Sandbox Code Playgroud)
我想要一个我可以运行的查询,我选择一台特定的计算机来显示软件版本和应用程序有哪些,但我也希望它显示它没有的应用程序(版本将是一个,NULL因为它没有那个软件就可以了)
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
Run Code Online (Sandbox Code Playgroud)
我想要以下结果集
ComputerName Name Version
Name1 Word 2003
Name1 Excel 2007
Name1 Powerpoint NULL
Run Code Online (Sandbox Code Playgroud)
但我得到了
Results
ComputerName Name Version
Name1 Word 2003
Name1 Excel 2007
Run Code Online (Sandbox Code Playgroud)
我认为RIGHT JOIN将包括应用程序表中的所有结果,即使它们与计算机无关.我错过了什么/做错了什么?
Chr*_*cht 13
使用LEFT JOIN或时RIGHT JOIN,无论是将过滤器放入WHERE还是放入过滤器,都会产生影响JOIN.
请参阅我之前写的类似问题的答案:
这两个查询有两个不同的结果集有什么区别?
简而言之:
WHERE子句中(就像你所做的那样,与该计算机无关的结果将被完全过滤掉JOIN,那么与该计算机无关的结果会出现在查询结果中,只有NULL值你期望的第三行(带有Powerpoint的那一行)被Computer.ID = 1条件过滤掉(尝试用Computer.ID = 1 or Computer.ID is null它运行查询以查看会发生什么).
但是,删除这个条件是没有意义的,因为毕竟我们想要一个给定计算机的列表.
我看到的唯一的解决方案是原来的查询和检索所应用的列表中选择一个新的查询之间执行UNION 不是该计算机上发现的.
查询可能如下所示:
DECLARE @ComputerId int
SET @ComputerId = 1
-- your original query
SELECT Computer.ComputerName, Application.Name, Software.Version
FROM Computer
JOIN dbo.Software_Computer
ON Computer.ID = Software_Computer.ComputerID
JOIN dbo.Software
ON Software_Computer.SoftwareID = Software.ID
RIGHT JOIN dbo.Application
ON Application.ID = Software.ApplicationID
WHERE Computer.ID = @ComputerId
UNION
-- query that retrieves the applications not installed on the given computer
SELECT Computer.ComputerName, Application.Name, NULL as Version
FROM Computer, Application
WHERE Application.ID not in
(
SELECT s.ApplicationId
FROM Software_Computer sc
LEFT JOIN Software s on s.ID = sc.SoftwareId
WHERE sc.ComputerId = @ComputerId
)
AND Computer.id = @ComputerId
Run Code Online (Sandbox Code Playgroud)