关于左连接、右连接、内连接的问题

Hansy Chen 2017-07-03 10:06:17
DROP TABLE IF EXISTS atab;
DROP TABLE IF EXISTS btab;
DROP TABLE IF EXISTS ctab;
DROP TABLE IF EXISTS dtab;


CREATE TABLE atab (
ID NUMBER(11) NOT NULL ,
BID NUMBER(11) DEFAULT NULL,
CID NUMBER(11) DEFAULT NULL,
DID NUMBER(11) DEFAULT NULL,
NAME VARCHAR2(20)DEFAULT NULL,
PRIMARY KEY (ID)
);
INSERT INTO atab(ID,BID,CID,DID,NAME) VALUES (1,1,1,1,'AAAAAAAA');
INSERT INTO atab(ID,BID,CID,DID,NAME) VALUES (2,1,3,2,'BBBBBBBB');
INSERT INTO atab(ID,BID,CID,DID,NAME) VALUES (3,2,1,2,'CCCCCCCC');



CREATE TABLE btab (
ID NUMBER(11) NOT NULL ,
CID NUMBER(11) DEFAULT NULL,
DID NUMBER(11) DEFAULT NULL,
NAME VARCHAR2(20) DEFAULT NULL,
PRIMARY KEY (ID)
);
INSERT INTO btab(ID,CID,DID,NAME) VALUES (1,1,1,'BTAB000000');
INSERT INTO btab(ID,CID,DID,NAME) VALUES (2,2,2,'BTAB111111');



CREATE TABLE ctab (
ID NUMBER(11) NOT NULL ,
NAME VARCHAR2(20) DEFAULT NULL,
PRIMARY KEY (ID)
);
INSERT INTO ctab(ID,NAME) VALUES (1,'CTAB0000');
INSERT INTO ctab(ID,NAME) VALUES (2,'CTAB1111');
INSERT INTO ctab(ID,NAME) VALUES (3,'CTAB2222');




CREATE TABLE dtab (
ID NUMBER(11) NOT NULL ,
TYPE CHAR(1) DEFAULT NULL,
NAME VARCHAR2(20) DEFAULT NULL,
PRIMARY KEY (ID)
);
INSERT INTO dtab(ID,TYPE,NAME) VALUES (1,'Y','DTAB11');
INSERT INTO dtab(ID,TYPE,NAME) VALUES (2,'N','DTAB22');


SELECT a.ID, b.ID, c.ID, d.ID, a.NAME, b.NAME, c.NAME, d.NAME, D.TYPE
FROM ATAB a, BTAB b, CTAB c, DTAB d
WHERE a.bid = b.id (+) AND a.did = d.id AND b.cid = c.id (+)
AND ((b.did = d.id AND d.id = 2) OR d.TYPE = 'Y' );

如何将上面这条 SQL 语句 转换成 left join 、inner join 的模式,

...全文
361 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
imcmuc 2017-07-06
  • 打赏
  • 举报
回复
引用 5 楼 shayboke 的回复:
[quote=引用 3楼qq_38206656 的回复:]
 SELECT a.ID, b.ID, c.ID, d.ID, a.NAME, b.NAME, c.NAME, d.NAME, D.TYPE  
FROM ATAB a
LEFT JOIN BTAB b ON a.bid = b.id 
LEFT JOIN CTAB c ON b.cid = c.id 
INNER JOIN DTAB d ON a.did = d.id AND ((b.did = d.id AND d.id = 2) OR d.TYPE = 'Y' )
大神,对这个还是有点不太理解,那个b和d表不需要连接吗?就是最后面那个条件。[/quote]不用吧,这样可以正确执行的,我的理解是LEFT JOIN B表以后,对D表来说,A表和B表是一个整体。
有意1314 2017-07-05
  • 打赏
  • 举报
回复
-- Create table create table B ( id VARCHAR2(20), job VARCHAR2(20), parent_id VARCHAR2(20) ) -- Create table create table A ( id VARCHAR2(20), name VARCHAR2(20) )

--内连接   
 select   a.*,b.*   from   a   inner   join   b     on   a.id=b.parent_id;
-- 左连接   
select   a.*,b.*   from   a   left   join   b     on   a.id=b.parent_id;   
--右连接   
select   a.*,b.*   from   a   right   join   b     on   a.id=b.parent_id;
--完全连接   
select   a.*,b.*   from   a   full   join   b     on   a.id=b.parent_id; 
--内连接 2 李四 1 23 2 1 张三 2 32 1 -- 左连接 1 张三 2 32 1 2 李四 1 23 2 3 44 4 --右连接 1 张三 2 32 1 2 李四 1 23 2 3 44 4 --完全连接 2 李四 1 23 2 1 张三 2 32 1 3 44 4 3 王五
Hansy Chen 2017-07-05
  • 打赏
  • 举报
回复
引用 3楼qq_38206656 的回复:
 SELECT a.ID, b.ID, c.ID, d.ID, a.NAME, b.NAME, c.NAME, d.NAME, D.TYPE  
FROM ATAB a
LEFT JOIN BTAB b ON a.bid = b.id 
LEFT JOIN CTAB c ON b.cid = c.id 
INNER JOIN DTAB d ON a.did = d.id AND ((b.did = d.id AND d.id = 2) OR d.TYPE = 'Y' )
大神,对这个还是有点不太理解,那个b和d表不需要连接吗?就是最后面那个条件。
qq_28538637 2017-07-04
  • 打赏
  • 举报
回复
SELECT A.*,B.*,C.* FROM TABLE A ,TABLE B,TABLE C WHERE A.XX =+ B.XX AND B.XX =+ C.XX AND C.XX=D.XX
Hansy Chen 2017-07-04
  • 打赏
  • 举报
回复
引用 1楼卖水果的net 的回复:
select * from a,b where a.id = b.id(+) left join: select * from a left b on a.id = b.id inner join: select * from a inner join b on a.id = b.id(+) PS:不要用 (+)这种形式了,这是非标准的语法,新版本的数据库产品,陆续不支持这种写法了。
这个我知道,我是说如何将上面那条转换为这种形式。
卖水果的net 2017-07-04
  • 打赏
  • 举报
回复
select * from a,b where a.id = b.id(+) left join: select * from a left b on a.id = b.id inner join: select * from a inner join b on a.id = b.id(+) PS:不要用 (+)这种形式了,这是非标准的语法,新版本的数据库产品,陆续不支持这种写法了。
imcmuc 2017-07-04
  • 打赏
  • 举报
回复
 SELECT a.ID, b.ID, c.ID, d.ID, a.NAME, b.NAME, c.NAME, d.NAME, D.TYPE  
FROM ATAB a
LEFT JOIN BTAB b ON a.bid = b.id 
LEFT JOIN CTAB c ON b.cid = c.id 
INNER JOIN DTAB d ON a.did = d.id AND ((b.did = d.id AND d.id = 2) OR d.TYPE = 'Y' )

17,089

社区成员

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

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