这是我正在进行的查询:
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)
它似乎拉出了正确的结果.为什么是这样?
这是一个布尔逻辑问题:
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