使用WHERE子句时,SQL JOIN不显示NULL结果

Bee*_*ems 1 sql-server sql-server-2008

服务器: SQL Server 2008 R2
SQL小提琴: http ://sqlfiddle.com/#!6/112a6/4/0

我为可怜的主题/标题道歉,但我很难说出如何陈述我的问题,所以我将用一个(可能)冗长的例子来画出来:

下面是一个相当简单的查询,它可以获取特定日期范围内PC的会话数.请注意,WHERE子句已被注释掉.我希望收到的是PC的完整列表,即使是在该范围内具有ZERO/NULL会话的PC.但是,当我添加WHERE子句时,我只能获得在该范围内有会话的PC.这是有问题的,因为我无法看到在此期间未使用的PC.

SELECT 
    f_assetnetbiosname, 
    COUNT(f_sessiondate) as 'Sessions'
FROM 
    tb_assets ass
LEFT JOIN 
    tb_sessions ses
  ON 
    ses.f_sessionnetbiosname = ass.f_assetnetbiosname  
--WHERE (f_sessiondate BETWEEN '04/01/2015' AND '04/30/2015')
GROUP BY f_assetnetbiosname

========================   =======================================|
| tb_assets            |   | tb_sessions                          |
========================   =======================================|
|   f_assetnetbiosname |   |  f_sessionnetbiosname  f_sessiondate |
------------------------   ---------------------------------------|
|     COMP_001         |   |    COMP_002            03/29/2015    |
|     COMP_002         |   |    COMP_002            03/30/2015    |
|     COMP_003         |   |    COMP_001            03/30/2015    |
------------------------   |    COMP_001            04/02/2015    |
                           |    COMP_001            04/03/2015    |
                           |    COMP_001            04/04/2015    |
                           |    COMP_001            04/05/2015    |
                           -----------------------------------
Run Code Online (Sandbox Code Playgroud)

基于这些结果的查询返回以下结果集:

|=================================|
| f_assetnetbiosname  | Sessions  |
|=================================|
| COMP_001            | 5         |
| COMP_002            | 2         |
| COMP_003            | 0         |
|=================================|
Run Code Online (Sandbox Code Playgroud)

问题是我需要实际搜索日期范围.因此,如果我取消注释上面查询中的"WHERE"子句,结果集看起来只有以下内容:

|=================================|
| f_assetnetbiosname  | Sessions  |
|=================================|
| COMP_001            | 4         |
|=================================|
Run Code Online (Sandbox Code Playgroud)

但我需要它看起来如下所示,以便我可以看到没有会话的PC:

|=================================|
| f_assetnetbiosname  | Sessions  |
|=================================|
| COMP_001            | 4         |
| COMP_002            | 0         |
| COMP_003            | 0         |
|=================================|
Run Code Online (Sandbox Code Playgroud)

有没有人解决这个问题?请注意,上面的例子只是一个例子.真正的查询是一个多CTE熊猫,但我认为最好将其简化为基础,这样我就不会通过炫耀我的坏代码来对话.

SQL小提琴:http://sqlfiddle.com/#!6/112a6/4/0

提前谢谢,
Beems

Tim*_*ter 5

您可以将其添加到Join子句中:

SELECT 
    f_assetnetbiosname, 
    COUNT(f_sessiondate) as 'Sessions'
FROM 
    tb_assets ass
LEFT OUTER JOIN 
    tb_sessions ses
  ON 
    ses.f_sessionnetbiosname = ass.f_assetnetbiosname 
    AND f_sessiondate BETWEEN '04/01/2015' AND '04/30/2015'
GROUP BY f_assetnetbiosname
Run Code Online (Sandbox Code Playgroud)

这是一个演示:http://sqlfiddle.com/#!6/112a6/23/0

这是Join-clause和a 的区别,这里Where也提到.