2017-08-31 173 views
-1

我想编写一个查询,其中i搜索表格系统和我希望它给我看有System.Type的=“WIFI”,但没有的System.Type =“传感器”所有帐户。试图用特定的控制器查询客户,但不添加设备,以便我们可以推销它们?请注意,客户端可能会有其他SYSTEM.TYPES查询无用,但会出现。SQL查询与包含和排除

使用SQL管理器中,使用当前的查询,但结果让我有错误的答案,一个例子是所谓的,其中每个系统登录与域系统acct_no和类型的表。我想要所有的acct_no'type'= WIFI,但没有'type'= FLOW。

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%') 
+0

你的问题必须证明你已经试图在你来到这里之前自己弄清楚这一点。另外,它还很不清楚 - 我不确定你甚至在问什么。如果你只是包括了'WHERE的System.Type =“WIFI'',是不是会足以消除所有其他类型的...? – Santi

+1

哪个[DBMS](https://en.wikipedia.org/wiki/DBMS)您使用的? –

+0

添加一些示例表格数据和预期结果 - 作为格式化文本。同时向我们展示您当前的查询尝试。 – jarlh

回答

-2

TYPE是系统表中的列名吗?如果是这样,你可以尝试这个查询:

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

我的代码出错了:Msg 102,Level 15,State 1,Line 3 '''附近语法不正确。 –

+1

为单个记录类型不能WIFI和传感器。每个帐户可以在系统表中多次列出,因此每个帐户有多个不同类型的记录。 – xQbert

2

这是你在找什么?我的理解是你有不同的ACCT_NO多个记录类型

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 
+0

似乎对我的正确回应。 – xQbert

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的帐号。
除了有'流量传感器','喷头'或'照明'类型的账户