结合AND&或存在

时间:2015-12-15 05:41:01

标签: sql sql-server subquery

我正在使用MS SQL Server 2012

我已经尝试了AND,OR和括号的各种组合,但我无法通过此查询返回它应该的结果集。我可以通过查询来排除'已关闭%'但我无法通过OR条款排除' Name One'

子查询中的第二个AND OR子句不包括基于AccountClosedDate的条目。

    SELECT 
    Distinct a.CompositeID,
    a.ClientID,
    a.ClientName,
    a.CompositeName,
    a.BranchName
    FROM  AllAccounts a
    WHERE (a.Compositename NOT LIKE 'Closed%' OR a.CompositeName <> 'Name One')
    AND EXISTS
    (
SELECT  DISTINCT CompositeID, CompositeName
FROM allaccounts c
WHERE c.CompositeID = a.CompositeID
AND (c.AccountClosedDate >= '1/1/2015' OR c.AccountClosedDate IS NULL))
ORDER BY a.CompositeName

示例输出我想要排除名称中已关闭的名称或名称一

CompositeID ClientID    ClientName  CompositeName   BranchName
8801    5318    Client1 Name Two    Firm1
7087    2311    Client2 Name Three  Firm1
4817    2311    Client3 Name Four   Firm1
11163   6863    Client4 Name Five   Firm1
4031    2540    Client5 Closed3 Firm2
5079    2061    Client6 Closed2 Firrm2
5079    1149    Client7 Closed2 Firm3
5079    2249    Client8 Closed2 Firm3
5079    1873    Client9 Closed2 Firm3
5079    960 Client10    Name One    Firm3
5079    1011    Client11    Name One    Firm3
5079    1588    Client12    Name One    Firm3
4090    1594    Client13    Name 6  Firm3

enter image description here

1 个答案:

答案 0 :(得分:1)

如果要根据上述2个条件排除名称,则需要在子句中使用AND:

(a.Compositename NOT LIKE 'Closed%' AND a.CompositeName <> 'Name One')

当它检查每条记录时,只有在满足两个条件时才包含它。

让我们看一些记录:

Name             AND            OR
Name Two         True           True
Closed3          False          True
Name One         False          True

如果您在条件之间加上OR,则包括所有不以“已关闭”字样开头的记录。或者不是“一个人”。所有记录都满足一个或另一个条件,因此包含所有记录。

所以&#39;已关闭3&#39;对于使OR-linked子句为真的第二个条件是正确的。同样,Name One对于第一个是正确的,这使整个条款成立。