2015-10-30 4 views
0

У меня есть три таблицы, как показано ниже. Мне нужно сделать левое соединение в таблице Customer and Order, и это нормально. После левого соединения мне нужен «город» каждого из клиентов, а значение «город» находится в таблице ADDRESS.Оставайтесь соединитесь и получите дополнительные данные из другой таблицы

КЛИЕНТ

cus_id 

ЗАКАЗЫ

order_id 
cus_id 

АДРЕС

cus_id 
city 

Запрос ниже возвращается 13 записей без внутреннего соединения с адресом таблицы

SELECT a.cus_id, 
     b.order_id 
FROM customer a 
     LEFT JOIN orders b 
       ON a.cus_id = b.cus_id 

Этот запрос возвращенного 10 результатов с внутренним соединением по АДРЕСУ

SELECT a.cus_id, 
     b.order_id, 
     c.city 
FROM customer a 
     LEFT JOIN orders b 
       ON a.cus_id = b.cus_id 
     INNER JOIN address c 
       ON c.cus_id = a_cus_id 

Куда делись 3 записи исчезают?

+0

Могут ли быть клиенты без адресов? Что произойдет, если вы просто присоединитесь к «клиенту» и «адресу»? Сколько строк вы получаете? – Mureinik

+0

Учитывая, что у клиента всегда есть адрес, второй запрос с внутренним соединением должен вернуть 13 записей? – Nero

ответ

1

Я сделал образец данных вы можете проверить, что у всех клиентов есть адреса?

create table customer(cus_id int); 
create table orders(order_id int, cus_id int); 
create table address(cus_id int, city varchar2(50)); 

insert into customer(cus_id) (select rownum from all_objects where rownum < 14) 
insert into orders(order_id, cus_id) select cus_id, cus_id from customer; 
insert into address(cus_id, city) select cus_id, cus_id||' city' from customer; 


SELECT a.cus_id, 
     b.order_id, 
     c.city 
FROM customer a 
     LEFT JOIN orders b 
       ON a.cus_id = b.cus_id 
     INNER JOIN address c 
       ON c.cus_id = a.cus_id; 
--13 records    

update address 
    set city = null 
where cus_id >10     

--execute ВЫБРАТЬ запрос - это возвращает 13 записей, но 3 последние записи имеют нулевые значения

delete from address 
    where cus_id >10 

--execute ВЫБРАТЬ запрос - возвращает 10 записей

--check, что все у клиентов есть адрес

select cus_id from customer 
minus 
select cus_id from address 
Смежные вопросы