SQL:如何 return 匹配 AND non-matching 具有 WHERE 条件的行

SQL: How to return matching AND non-matching rows with WHERE condition

为了澄清标题,我有 table 台计算机和 table 台更新。我需要查看哪些计算机应用了特定更新,哪些计算机没有应用。

我有以下查询,return NULLf_logsoftware

SELECT 
    f_logmachine, f_logsoftware
FROM  
    tb_computers c
LEFT JOIN 
    tb_softwareinstalls s ON c.f_assetID = s.f_logmachine
WHERE 
    f_logsoftware = 'Java (7.0.750)'

上面的return是这样的:

f_logmachine     f_logsoftware
-------------------------------
10001            Java (7.0.750)
10003            Java (7.0.750)
10005            Java (7.0.750)
10007            Java (7.0.750)

但我希望得到这样的输出:

f_logmachine     f_logsoftware
-------------------------------
10001            Java (7.0.750)
10002            NULL
10003            Java (7.0.750)
10004            NULL
10005            Java (7.0.750)
10006            NULL
10007            Java (7.0.750)

我已经尝试了所有我能想到的 "JOIN" 组合,但我很难过。

也搜索 NULL 怎么样:

SELECT  f_logmachine ,
        f_logsoftware
FROM    tb_computers c
        LEFT JOIN tb_softwareinstalls s ON c.f_assetID = s.f_logmachine
WHERE   f_logsoftware = 'Java (7.0.750)'
        OR f_logsoftware IS NULL

当然不会显示NULL,因为您正在过滤那些结果:WHERE f_logsoftware = 'Java (7.0.750)',并且NULL不等于'Java (7.0.750)'。 您应该在加入之前过滤结果:

SELECT c.f_assetID as f_logmachine, f_logsoftware
FROM tb_computers c
LEFT JOIN ( SELECT *
            FROM tb_softwareinstalls
            WHERE f_logsoftware = 'Java (7.0.750)') s 
    ON c.f_assetID = s.f_logmachine
ORDER BY c.f_assetID

由于您的 WHERE f_logsoftware = 'Java (7.0.750)' 不限制返回的行,它在 where 子句中看起来很奇怪。您要做的是将 'Java (7.0.750)' 映射到自身,并将 f_logsoftware 的所有其他值映射到 null。

尝试在投影中使用 'CASE .. WHEN .. THEN .. ELSE .. END'。