SQL WHERE使用AND和NOT排除记录

Ger*_*ton 0 sql syntax

这是我正在进行的查询:

SELECT  TBL_SUB_KEY AS port
      , poe.[TBL_COMPANY]
      , poe.[TBL_DIVISION_1]
FROM    dbo.TMVKTAB AS poe
WHERE   ( TBL_NUMBER = '8A' )
        AND ( TBL_SUB_KEY <> '' )
        AND ( poe.[TBL_COMPANY] <> '011'
              AND poe.[TBL_DIVISION_1] <> '11'
            )
Run Code Online (Sandbox Code Playgroud)

我要返回的是所有不在公司='011'/ Division_1'='11'的记录.

我认为在()中组合公司/部门会实现这一点,但事实并非如此.它消除了所有公司的'011'记录,并消除了所有分部'11'记录.

但是,当我这样做时:

SELECT  TBL_SUB_KEY AS port
      , poe.[TBL_COMPANY]
      , poe.[TBL_DIVISION_1]
FROM    dbo.TMVKTAB AS poe
WHERE   ( TBL_NUMBER = '8A' )
        AND ( TBL_SUB_KEY <> '' )
        AND NOT ( poe.[TBL_COMPANY] = '011'
              AND poe.[TBL_DIVISION_1] = '11'
            )
Run Code Online (Sandbox Code Playgroud)

它似乎拉出了正确的结果.为什么是这样?

tek*_*ues 5

这是一个布尔逻辑问题:

NOT (A and B) <=> NOT A  OR NOT B
Run Code Online (Sandbox Code Playgroud)

即:

NOT ( poe.[TBL_COMPANY] = '011' AND poe.[TBL_DIVISION_1] = '11')
Run Code Online (Sandbox Code Playgroud)

相当于:

( poe.[TBL_COMPANY] <> '011' OR poe.[TBL_DIVISION_1] <> '11')
Run Code Online (Sandbox Code Playgroud)

读:

http://en.wikipedia.org/wiki/Boolean_logic