Я понимаю, что не в делает в SQL, но я запутался, что он делает, когда есть две вещи - PullRequest
0 голосов
/ 30 октября 2018

Сравнивает ли buy_ccy с sell_ccy во втором выборе? Тогда продать_ccy до buy_ccy? Имеет ли значение порядок второго оператора выбора? Заранее спасибо! :)

select 
    customer,order_no,buy_ccy,sell_ccy 
from 
    fxbook f1
where 
    (buy_ccy,sell_ccy) not in (select 
                                    sell_ccy,buy_ccy 
                               from 
                                    fxbook
                               where 
                                    f1.customer <> customer)"

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Я бы предостерег вас от использования not in с подзапросом. Если какое-либо значение в подзапросе равно null, то строки вообще не возвращаются.

По этой причине я настоятельно рекомендую not exists с подзапросами:

select f.*
from fxbook f
where not exists (select 1
                  from fxbook f2
                  where f2.buy_ccy = f.buy_ccy and
                        f2.sell_ccy = f.sell_ccy and
                        f2.customer <> f.customer
                 );
0 голосов
/ 30 октября 2018

Сравнение IN () с несколькими столбцами просто сравнивает ВСЕ столбцы в том порядке, в котором вы их представляете, но есть веская причина, по которой вам следует включать псевдонимы таблиц в ссылках на столбцы:

where          (f1.buy_ccy    , f1.sell_ccy) 
not in (select fxbook.sell_ccy, fxbook.buy_ccy from fxbook ...)

SO  f1.buy_ccy  compares to fxbook.sell_ccy 
AND f1.sell_ccy compares to fxbook.buy_ccy

Думайте о NOT как о the inverse of. Здесь, если есть совпадение, оно преобразуется в ложь, а если совпадения не было, оно преобразуется в истину. Истинные строки - это те, которые возвращаются запросом.

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