SQL WHERE, исключая записи, использующие AND и NOT - PullRequest
0 голосов
/ 11 июня 2009

Вот запрос, над которым я работаю:

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'
            )

Я хочу вернуть все записи, которые не в Company = '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'
            )

это похоже на правильные результаты. Почему это?

Ответы [ 5 ]

5 голосов
/ 11 июня 2009

Это проблема булевой логики:

NOT (A and B) <=> NOT A  OR NOT B

т.е:.

NOT ( poe.[TBL_COMPANY] = '011' AND poe.[TBL_DIVISION_1] = '11')

Эквивалентно:

( poe.[TBL_COMPANY] <> '011' OR poe.[TBL_DIVISION_1] <> '11')

Читать:

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

3 голосов
/ 11 июня 2009

Я думаю, что эквивалент НЕ будет использовать ИЛИ, как показано ниже:

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'
              OR poe.[TBL_DIVISION_1] <> '11'
            )
2 голосов
/ 11 июня 2009
where x and (y and z)

совпадает с

x and y and z

однако

where x and not (y and z)

это то, что вы хотите, и работает.

попробуйте это:

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'
                )
1 голос
/ 11 июня 2009

Время для некоторой булевой алгебры. Это:

not (x and y)

совпадает с:

(not x or not y)

Итак, ваш запрос должен быть:

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'
              OR poe.[TBL_DIVISION_1] <> '11'
            )
0 голосов
/ 11 июня 2009

Поскольку записи, не принадлежащие , обе Компания 011 и Отдел 11 соответствуют

          poe.[TBL_COMPANY] <> '011'
          OR poe.[TBL_DIVISION_1] <> '11'

Если компания не 011, деление может быть 11, и у вас все равно будет подходящая комбинация.

Закон Де Моргана объясняет, как преобразовывать логические выражения таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...