SELECT WHERE相关记录的值没有出现

时间:2017-10-26 12:25:37

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

我有一个Client表和一个Devices表。

客户端可以拥有多个设备,并且客户端具有活动状态,与设备一样。

我想要所有活跃但没有活动设备的客户端。

我INNER加入了客户端上所有活动客户端的设备,因此客户端不止一次出现,但现在我不知道如何选择所有没有活动设备的客户端。

这就是我的人际关系的设置方式:

客户端

pkClientID   Name     IsActive
------------------------------
1            Jake     1
2            Philip   1

设备

pkDeviceID  fkClientID  DeviceName  IsActive
---------------------------------------------
1           1           Samsung     1
2           1           Apple       0
3           2           Samsung     0
4           2           Sony        0

由于我已经拥有所有活跃客户,因此我只选择菲利普,因为他处于活动状态但没有活动设备?

2 个答案:

答案 0 :(得分:4)

使用not exists()

select *
from client c
where c.isactive = 1 
  and not exists (
    select 1
    from device d
    where d.fkclientid = c.pkclientid
      and d.isactive = 1
      )

rextester演示:http://rextester.com/NCR78612

返回:

+------------+--------+----------+
| pkClientid |  Name  | IsActive |
+------------+--------+----------+
|          2 | Philip |        1 |
+------------+--------+----------+

答案 1 :(得分:2)

使用not innot existsleft join / where

select c.*
from client c
where c.IsActive = 1 and
      not exists (select 1
                  from devices d
                  where d.fkClientID = c.ClientID and d.IsActive = 1
                 );