Oracle оставил присоединиться один ко многим - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть две таблицы (например, немного свернутые)

Таблица 1: клиент

Id  customerName
1   A
2   B
3   C
4   D

Таблица 2: заказ

Id  customerId  productName
1   2           ABC
2   2           DEF
3   4           ABC
4   5           FGH

Я хочуувидеть всех клиентов без заказа.Что-то вроде:

customerId  
1   
3   

Итак, я попытался

SELECT c.id as customerId
FROM customer_table c
LEFT JOIN order_table o
ON c.id = o.customerId
AND c.customerid IS NULL

Но результат, который я получил:

customerId  
1
2
2
3
4   

Пожалуйста, помогите объяснить, что здесь происходит не так,

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Ваш запрос в порядке, и вам нужно только переместить чек NULL в предложение WHERE:

SELECT c.id as customerId
FROM customer_table c
LEFT JOIN order_table o
    ON c.id = o.customerId
WHERE o.customerid IS NULL;

enter image description here

Демонстрация

Проблема с установкой проверки NULL в предложении ON состоит в том, что она приведет к тому, что каждая запись клиента будет сохранена в наборе результатов,даже если эта запись не соответствует фактическим заказам.Обратите внимание, что ваша проблема в чем-то противоположна тому, что мы обычно видим, а именно помещает логику в предложение WHERE, которое действительно принадлежит предложению ON.

Демонстрация в SQL Server, потому что по сей деньОракул пугает меня.

0 голосов
/ 27 сентября 2018
  with tcustomer (id, name) as
      (select 1, 'a' from dual union all
       select 2, 'b' from dual union all
       select 3, 'c' from dual union all
       select 4, 'd' from dual
      ),
    torder (id, customerid, productname) as
      (select 1, 2, 'abc' from dual union all
       select 2, 2, 'def' from dual union all
      select 3, 4, 'abc' from dual union all
      select 4, 5, 'fgh' from dual
     )
   select c.id
   from tcustomer c
   where null not in (select null
                     from torder t
                     where t.customerid = c.id); 

Output:

ID
1
3
0 голосов
/ 27 сентября 2018

NOT EXISTS - это то, что вам, вероятно, нужно:

SQL> with customer (id, name) as
  2    (select 1, 'a' from dual union all
  3     select 2, 'b' from dual union all
  4     select 3, 'c' from dual union all
  5     select 4, 'd' from dual
  6    ),
  7  torder (id, customerid, productname) as
  8    (select 1, 2, 'abc' from dual union all
  9     select 2, 2, 'def' from dual union all
 10     select 3, 4, 'abc' from dual union all
 11     select 4, 5, 'fgh' from dual
 12    )
 13  select c.id
 14  from customer c
 15  where not exists (select null
 16                    from torder t
 17                    where t.customerid = c.id);

        ID
----------
         3
         1

SQL>

или MINUS оператор набора (худшая производительность, чем NOT EXISTS):

select c.id from customer c
minus
select t.customerid from torder t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...