SQL:如何使用WHERE条件返回匹配和不匹配的行

时间:2015-04-07 20:03:04

标签: sql sql-server sql-server-2008-r2

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

我有以下查询,它不会返回NULL的{​​{1}}行。

f_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)'

但我希望输出如下:

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

我已经尝试过" JOIN"的每一个组合。我能想到,但我很难过。

3 个答案:

答案 0 :(得分:2)

当然它没有显示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

答案 1 :(得分:0)

如何搜索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

答案 2 :(得分:0)

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

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