【问题标题】:Do left join and get additional from another table做左连接并从另一个表中获取更多信息
【发布时间】:2016-01-31 02:37:22
【问题描述】:

我有三个表,如下所示。我需要在客户和订单表上进行左连接,这很好。做左连接后,我需要每个客户的“城市”,“城市”值在 ADDRESS 表中。

客户

cus_id

订单

order_id
cus_id

地址

cus_id
city

下面的查询返回了 13 条记录,没有与 ADDRESS 表进行内连接

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

此查询返回 10 个结果,并在 ADDRESS 上进行内连接

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 条记录在哪里消失了?

【问题讨论】:

  • 会有没有地址的客户吗?如果你只是内部加入customeraddress 会发生什么?你得到了多少行?
  • 假设一个客户总是有一个地址,第二个内连接查询应该返回 13 条记录?

标签: database oracle join left-join inner-join


【解决方案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                  

--执行 SELECT 查询 - 它返回 13 条记录,但最后 3 条记录为空值

delete from address
  where cus_id >10

--执行SELECT查询-返回10条记录

--检查所有客户是否有地址

select cus_id from customer
minus
select cus_id from address

【讨论】:

    猜你喜欢
    • 2014-05-15
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多