包含和排除的SQL查询

时间:2017-08-31 14:40:38

标签: sql sql-server

我正在尝试编写一个查询,我搜索一个表格系统,我想让它向我展示所有有SYSTEM.TYPE =' WIFI'但没有SYSTEM.TYPE =' SENSOR'。尝试使用特定的控制器查询客户端但没有添加设备,以便我们可以推销它们?请注意,客户端可能有其他SYSTEM.TYPES,这些SYSTEM.TYPES无法查询但会存在。

使用SQL Manager,使用当前的查询但结果给出了错误的答案,一个示例是一个名为系统的表,其中每个系统都记录了字段acct_no和type。我希望所有的acct_no在哪里'键入' = WIFI,但没有'类型' =流量。

SELECT S.ACCT_NO, s.[type] 
FROM [system] S 
LEFT OUTER JOIN [system] FS 
  on FS.acct_no = S.acct_no
WHERE not exists (SELECT 1 
                  FROM [system] 
                  WHERE [system].ACCT_NO = fs.ACCT_NO 
                    AND FS.[TYPE] in ('flow sensor', 'sprinkler', 'lighting'))
  AND (s.[type] like '%wifi%') 

3 个答案:

答案 0 :(得分:2)

这是你在找什么?我的理解是每个ACCT_NO有多个记录,具有不同的TYPE

SELECT s1.ACCT_NO 
FROM [system]  s1
WHERE s1.[type] like '%wifi%'
  AND NOT EXISTS 
    (SELECT 1 
     FROM [system] s2 
     WHERE s1.ACCT_NO = s2.ACCT_NO 
       AND s2.[type] in ('flow sensor', 'sprinkler', 'lighting')) 
ORDER BY ACCT_NO

答案 1 :(得分:0)

另一种方法。

SELECT Distinct s1.ACCT_NO 
FROM [system]  s1
WHERE s1.[type] like '%wifi%'
EXCEPT
SELECT Distinct s2.ACCT_NO  
FROM [system] s2 
WHERE s2.[type] in ('flow sensor', 'sprinkler', 'lighting')

选择所有类型为wifi的帐号 除了具有“流量传感器”,“喷水器”或“照明”类型的帐户

答案 2 :(得分:-2)

TYPE是Systems表中的列名吗?如果是这样,您可以尝试此查询:

select * 
from SYSTEMS 
where (SYSTEMS.TYPE='WIFI' and SYSTEMS.TYPE!='SENSOR');