sql-server - SQL Server : Multiple table joins with a WHERE clause

标签 sql-server join where-clause

我正在使用 SQL Server,但在尝试从我想要的 SELECT 查询中获取结果时遇到了困难。我尝试过加入不同的顺序并使用子查询,但没有什么能按照我想要的方式工作。以这个可能安装在人们计算机上的具有不同版本级别的软件应用程序为例。

我需要使用 WHERE 执行 JOIN,但由于某种原因我无法获得我想要的结果。

也许我看的数据是错误的,我不太确定为什么我不能让它工作。

应用

ID  Name
1   Word
2   Excel
3   Powerpoint

软件表(包含不同应用程序的版本信息)

ID  ApplicationID   Version
1   1             2003
2   1             2007
3   2             2003
4   2             2007
5   3             2003
6   3             2007

Software_Computer联结表

ID  SoftwareID  ComputerID
1   1           1
2   4           1
3   2           2
4   5           2

计算机

ID  ComputerName
1   Name1
2   Name2

我想要一个可以在选择特定计算机时运行的查询来显示软件版本和应用程序具有的软件版本和应用程序,但我也希望它显示它没有的应用程序(版本将为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 

我想要以下结果集

ComputerName   Name          Version
Name1          Word          2003
Name1          Excel         2007
Name1          Powerpoint    NULL

但我刚刚得到

Results
ComputerName   Name          Version
Name1          Word           2003
Name1          Excel          2007

我认为RIGHT JOIN会包含应用程序表中的所有结果,即使它们与计算机无关。我错过了什么/做错了什么?

最佳答案

使用LEFT JOINRIGHT JOIN时,将过滤器放在WHERE中还是放入中会有所不同加入

请参阅我不久前写的类似问题的答案:
What is the difference in these two queries as getting two different result set?

简而言之:

  • 如果将其放入 WHERE 子句中(就像您所做的那样,与该计算机无关的结果将被完全过滤掉
  • 如果您将其放入 JOIN 中,则与该计算机无关的结果将出现在查询结果中,仅具有 NULL
    --> 这就是你想要的

关于sql-server - SQL Server : Multiple table joins with a WHERE clause,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8758223/

相关文章:

sql - 支持外键检查约束

ios - 解析.com : how to join 2 tables?

MySQL 选择类似路径的位置

sql-server - SQL Server Analysis Services - 我有吗?

sql-server - SQL Server 中的数据库表关系

sql - 选择 MAX 日期加上 ID 值

php - IN 查询搜索什么?

sql - SQL 表中的输出 : without using JOIN

mysql - 如何合并连接表结果中的列?

mysql - Prestashop - ListView 过滤器