Разница между "=" и "IN" / "NOT IN" и "MINUS" - PullRequest
0 голосов
/ 28 марта 2012

Филиал (имя_ филиала, филиал_город, активы)
Клиент (имя_пользователя, сценарий_пользователя, клиент_город)
Кредит (номер_счета, имя_ответа, сумма)
Заемщик (имя_пользователя, номер_средства)
Счет (номер_счета, имя_сектора, баланс)
Вкладчик (customer_name, account_number)

Как бывают "=" и "IN" и "NOT IN" и "MINUS" в

select c.customer_name
from Customer c, Borrower b, Loan l
where c.customer_city = 'Fairfax AND c.customer_name = b.customer_name 
                AND b.loan_number = l.loan_number
minus
select d.customer_name 
from Depositer d, Account a
where d.account_number = a.account_number 

И

select c.customer_name
from Customer c
where c.customer_city = 'Fairfax' AND c.customer_name in
    (select b.customer_name 
    from Borrower b
    where b.loan_number in
       (select l.loan_number 
       from Loan l
       where b.customer_name not in
           (select d.customer_name
           from Account a, Depositor d
           where a.account_number = d.account_number)))

отличаются друг от друга?Они должны выполнить то же самое

Ответы [ 3 ]

1 голос
/ 29 марта 2012

Одним из «радостей» SQL является то, что один и тот же реляционный оператор (пересечение, различие и т. Д.) Может быть написан с использованием различных эквивалентных конструкций SQL (что частично объясняет, почему оптимизаторы SQL не всегда выбирают лучший план безсправка от пользователей).

Используя эти простые таблицы примеров:

WITH A AS (SELECT * FROM (VALUES (1), (2), (3)) AS T (n)), 
     B AS (SELECT * FROM (VALUES (3), (4), (5)) AS T (n))

Пересечение с использованием IN (<subquery>)

SELECT n
  FROM A
 WHERE n IN ( SELECT n FROM B ) ;

Пересечение с использованием количественного сравнения

SELECT n
  FROM A
 WHERE n = ANY ( SELECT n FROM B ) ; 

Пересечение с использованием INTERSECT

SELECT n
  FROM A
INTERSECT
SELECT n
  FROM B;

Пересечение с использованием INTERSECT, альтернативный синтаксис:

TABLE A 
INTERSECT 
TABLE B;

Пересечение с использованием EXISTS (<subquery>)

SELECT n
  FROM A
 WHERE EXISTS ( SELECT *
                  FROM B 
                 WHERE B.n = A.n 
              ); 

Пересечение с использованием соединения

SELECT n
  FROM A NATURAL JOIN B; 

Пересечение с использованием MATCH (<subquery>)

SELECT n
  FROM A
 WHERE n MATCH ( SELECT n FROM B ) ;

Разница с использованием NOT IN (<subquery>)

SELECT n
  FROM A
 WHERE n NOT IN ( SELECT n FROM B ) ;

Разница с использованием количественного определениясравнение

SELECT n
  FROM A
 WHERE n <> ALL ( SELECT n FROM B ) ; 

Разница с использованием EXCEPT [MINUS в Oracle]

SELECT n
  FROM A
EXCEPT
SELECT n
  FROM B;

Разница с использованием EXCEPT, альтернативный синтаксис:

TABLE A 
EXCEPT 
TABLE B;

Разницаиспользование NOT EXISTS (<subquery>)

SELECT n
  FROM A
 WHERE NOT EXISTS ( SELECT *
                      FROM B 
                     WHERE B.n = A.n 
                  ); 

Разница с использованием объединения

SELECT A.n
  FROM A LEFT OUTER JOIN B ON A.n = B.n
 WHERE B.n IS NULL;

[В SQL нет оператора NOT MATCH!]

0 голосов
/ 28 марта 2012

WHERE ... IN ... позволяет искать список значений, например:

SELECT * FROM `orders` WHERE `status` IN("placed", "processed", "fulfilled")

Это проще, чем написать это:

SELECT * FROM `orders` WHERE `status` = "placed" OR `status` = "processed" OR `status` = "fulfilled"

Особенно, когда вы не знаете «диапазон» возможных значений или хотите объединить это условие с другими условиями (становится неприятно иметь много условий в скобках). Например:

SELECT * FROM `orders_items` WHERE `order_id` IN (
    SELECT `order_id` FROM `orders` WHERE `status` IN ("processed", "fulfilled")
)

Во многих случаях JOIN будет более подходящим (например, в последнем примере), но WHERE ... IN ... хорошо, когда у вас есть столбец ENUM или предварительно определенный список возможных фильтров.

WHERE ... NOT IN ... то же самое, но отрицается.

Чтобы ответить на ваш актуальный вопрос, честно говоря, у меня нет времени, чтобы увидеть, как эти запросы отличаются. Я предпочел бы первый запрос второму, если только для удобства чтения. Я почти всегда предпочел бы JOIN s вместо WHERE IN или WHERE NOT IN, когда вы имеете дело со ссылками первичного ключа (то есть столбцы INT).

0 голосов
/ 28 марта 2012

= используется для сравнения с одним значением, а IN используется для сравнения с несколькими значениями. Тогда NOT IN будет прямо противоположным, т. Е. Если оно будет равно чему угодно, кроме этого набора значений, а MINUS фактически вычитает каждый результат из первого подзапроса из второго подзапроса.

Вы можете найти больше информации о MINUS здесь: ключевое слово MINUS

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