Применимо ли «НЕ» к другим логическим операторам в SQL?

#sql

#sql

Вопрос:

Я практиковал SQL в w3resource.com » у нас с веб-сайтом была проблема с пониманием решения этого упражнения;

ссылка : https://www.w3resource.com/sql-exercises/sql-boolean-operator-exercise-6.php

проблема: напишите инструкцию SQL для отображения либо тех заказов, которые не выданы на дату 2012-09-10 и выданы продавцом с идентификатором 5005 и ниже, либо тех заказов, сумма покупки которых составляет 1000,00 и ниже.

Примерная таблица: заказы

 ord_no      purch_amt   ord_date    customer_id  salesman_id
----------  ----------  ----------  -----------  -----------
70001       150.5       2012-10-05  3005         5002
70009       270.65      2012-09-10  3001         5005
70002       65.26       2012-10-05  3002         5001
70004       110.5       2012-08-17  3009         5003
70007       948.5       2012-09-10  3005         5002
70005       2400.6      2012-07-27  3007         5001
70008       5760        2012-09-10  3002         5001
70010       1983.43     2012-10-10  3004         5006
70003       2480.4      2012-10-10  3009         5003
70012       250.45      2012-06-27  3008         5002
70011       75.29       2012-08-17  3003         5007
70013       3045.6      2012-04-25  3002         5001
  

мое решение:

 select * from orders where (ord_date <> '2012-09-10' and salesman_id <= '5005') or purch_amt <= '1000';
  

их решение:

 SELECT * FROM  orders WHERE NOT ((ord_date ='2012-09-10'AND salesman_id > 5005) OR purch_amt > 1000.00);
  

вопрос: в их решении утверждение «NOT» применяется к «ИЛИ» это приемлемо? и какое решение является правильным?

Спасибо

Комментарии:

1. Практический вопрос неоднозначен, любой ответ может быть интерпретацией

Ответ №1:

NOT принимает один операнд. В этом выражении:

 WHERE NOT ((ord_date ='2012-09-10'AND salesman_id > 5005) OR purch_amt > 1000.00);
  

Операндом является все заключенное в скобки выражение. Ваше выражение не эквивалентно, но приведенное выше эквивалентно следующему, поскольку NOT (A OR B) эквивалентно (NOT A AND NOT B) и NOT (A AND B) эквивалентно (NOT A OR NOT B) :

 WHERE NOT (ord_date = '2012-09-10' AND salesman_id > 5005) AND
      NOT (purch_amt > 1000.00)

WHERE NOT (ord_date = '2012-09-10' AND salesman_id > 5005) AND
      purch_amt <= 1000.00

WHERE (NOT (ord_date = '2012-09-10') OR NOT (salesman_id > 5005)) AND
      purch_amt <= 1000.00

WHERE (ord_date <> '2012-09-10' OR salesman_id <= 5005) AND
      purch_amt <= 1000.00
  

Комментарии:

1. спасибо за ваш ответ, но соответствует ли их ответ тексту?

2. @GuissousAllaeddine . , , Английский неоднозначен, потому что неясно, к чему not именно относится. Я думаю, что ваша интерпретация ближе к английской. Это not подпункт either / or , поэтому значение or — to может быть прочитано — не должно быть отменено.