Это связано с тем, что если любое из ваших предложений OR в скобках окажется истинным, строка включается. Два ваших условия ИЛИ вместе взятые логически означают объединение всех рядов, где задание НЕ является «Сэмом Мудрым» или НЕ «Драгоценным». И все ряды соответствуют этим критериям, поскольку, например, «Сэм Мудрый» не является «Драгоценным» и поэтому отвечает второму условию.
Вот то, что я думаю, вы пытались:
select dept, job
from organizations
where
dept = 'Marketing'
and not (
job = 'Sam Wise'
or job = 'The Precious'
)
И обратите внимание, вы можете просто использовать AND:
select dept, job
from organizations
where
dept = 'Marketing'
and job <> 'Sam Wise'
and job <> 'The Precious'
Это хороший пример закона логики. Чтобы обозначить то же условие (A = X OR B = Y)
, но выразить его отрицательно (вы хотите, чтобы НЕ было впереди), оно всегда преобразуется в NOT (A <> X AND B <> Y)
. Он работает так же с (A = X AND B = Y)
=> NOT (A <> X OR B <> Y)
. В вашем случае A
и B
одинаковы, поэтому ваши условия запроса на job
эквивалентны NOT (A = X AND A = Y)
, что, как полагают некоторые, всегда будет возвращать true, поскольку A = X AND A = Y
никогда не может быть истинным.
Поскольку IN () может использоваться для выражения многих условий OR вместе, вы можете упростить запрос следующим образом: (хотя не работа, которую должен делать движок, это идентично).
select dept, job
from organizations
where
dept = 'Marketing'
and job not in ('Sam Wise', 'The Precious')
Чуть позже я понял, что перевод A = X
=> A <> X
- это просто отрицание, в особом смысле этого слова. В простейшей форме закон логики выглядит следующим образом, учитывая два предложения P1 и P2:
NOT (P1 AND P2)
=> (NOT P1 OR NOT P2)
NOT (P1 OR P2)
=> (NOT P1 AND NOT P2)
Обратите внимание, что они тоже верны:
(P1 AND P2)
=> NOT (NOT P1 OR NOT P2)
(P1 OR P2)
=> NOT (NOT P1 AND NOT P2)
Это преобразования, которые также могут быть очень полезны.