数据库多表连接left join

菜鸟小A 2015-04-02 03:29:39

CREATE TABLE A
(ID integer,
DIS integer,
branch integer,
trans integer)
insert into A (id,dis,branch,trans) values (68001,568,568,001);
CREATE TABLE B
(ID integer,
ID_APP integer)
insert into B (id,id_app) values (68001,68001);



CREATE TABLE C
(ID integer,
DIS integer,
branch integer,
trans integer
status integer)
insert into C(id,dis,branch,trans,status) values (68001,568,568,001,02);
insert into C (id,dis,branch,trans,status) values (68001,218,218,005,02);




select a.id as id_app,b.id,c.status from A a
left join C c on a.dis = c.dis
and a.branch = c.branch
and a.trans = c.trans
and a.id = c.id
left join B b on c.id=b.id

我期望得到的结果是
id_app id status
68001 68001 02
实际得到的结果是
68001 NULL 02
关于第二个左连接(...)D left join B等值连接条件c.id=b.id中的c.id并没有在第一个左连接中选出来,但是C表和B表都存在id为68001的记录的。
我想问的是怎么才能得到我期望的结果?怎么分析多表连接最终得到的结果?
...全文
566 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_27418749 2015-04-15
  • 打赏
  • 举报
回复
楼上的很正确
华而不实 2015-04-15
  • 打赏
  • 举报
回复
试过了,没问题。能得到你要的结果!
菜鸟小A 2015-04-03
  • 打赏
  • 举报
回复

select a.id as id_app,b.id,c.status from A a
left join C c on a.dis = c.dis 
and a.branch = c.branch
and a.trans = c.trans
and nvl(a.id,c.id) = c.id
left join B b on c.id=b.id
试试这个,得到的结果就不行了
菜鸟小A 2015-04-03
  • 打赏
  • 举报
回复
不科学啊,这是我简化后的一个例子,怎么就跑出来了? 我在另外一个实例上怎么也跑不出我要的结果,您有qq方便联系吗?我把脚本给你帮我试试看
卖水果的net 2015-04-02
  • 打赏
  • 举报
回复

-- 这里跑的是你原本的语句,没有问题。
SQL> CREATE TABLE A(ID integer,DIS integer,branch integer,trans integer);
 
Table created
SQL> insert into  A (id,dis,branch,trans) values (68001,568,568,001);
 
1 row inserted
SQL> CREATE TABLE B(ID integer, ID_APP integer);
 
Table created
SQL> insert  into B(id,id_app) values (68001,68001);
 
1 row inserted
SQL> CREATE TABLE C(ID integer,DIS integer,branch integer,trans integer,status integer);
 
Table created
SQL> insert into C(id,dis,branch,trans,status) values (68001,568,568,001,02);
 
1 row inserted
SQL> insert into C (id,dis,branch,trans,status) values (68001,218,218,005,02);
 
1 row inserted
SQL> commit ;
 
Commit complete
SQL> select a.id as id_app,b.id,c.status from A a
  2  left join C c on a.dis = c.dis
  3  and a.branch = c.branch
  4  and a.trans = c.trans
  5  and a.id = c.id
  6  left join B b on c.id=b.id ;
 
                                 ID_APP                                      ID                                  STATUS
--------------------------------------- --------------------------------------- ---------------------------------------
                                  68001                                   68001                                       2
 
SQL> 
菜鸟小A 2015-04-02
  • 打赏
  • 举报
回复
引用 3 楼 wmxcn2000 的回复:
方便提供一些数据库吗,查不出来的那些数据。
我提问中已经给出了建表脚本,并且自己加了些数据。 其实我更想知道怎么分析多表连接最终生成的数据
卖水果的net 2015-04-02
  • 打赏
  • 举报
回复
方便提供一些数据库吗,查不出来的那些数据。
菜鸟小A 2015-04-02
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:

-- 使用一个 NVL函数
select a.id as id_app,isnull(b.id,a.id) id ,c.status from A a   
left join C c on a.dis = c.dis 
and a.branch = c.branch
and a.trans = c.trans
and a.id = c.id
left join B b on c.id=b.id
1、B表是专门存储id的表,不能用其他表中的这个字段代替。 2、我给的例子中B表该字段是有值的,但是现在查不出来
卖水果的net 2015-04-02
  • 打赏
  • 举报
回复

-- 使用一个 NVL函数
select a.id as id_app,isnull(b.id,a.id) id ,c.status from A a   
left join C c on a.dis = c.dis 
and a.branch = c.branch
and a.trans = c.trans
and a.id = c.id
left join B b on c.id=b.id

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧