+ -
当前位置:首页 → 问答吧 → 这个左连接该怎么写??(貌似很简单的问题)

这个左连接该怎么写??(貌似很简单的问题)

时间:2011-09-08

来源:互联网

把这个SQL

select * from test a
left join test1 b
on a.id = b.id and a.t = 'a'



select * from test a,test1 b where a.id=b.id(+)

来写,该怎么改?

作者: rainxies   发布时间: 2011-09-08

你加一个 and a.t = 'a' 不就改好了吗?

作者: opps_zhou   发布时间: 2011-09-08

SQL code
select * from test a,test1 b
 where a.id=b.id(+)
   and a.t = 'a';

作者: luoyoumou   发布时间: 2011-09-08

select * from test a,test1 b 
  where a.id=b.id and a.t = 'a';

作者: yyh1988923   发布时间: 2011-09-08

看来大家都考虑简单了,
select * from test a left join test1 b on a.id = b.id and a.t = 'a'
的结果如下
[img=select * from test a left join test1 b on a.id = b.id and a.t = 'a'][/img]


select * from test a,test1 b where a.id=b.id(+) and a.t='a'
的结果如下:


显然不对,高手出现啊

作者: rainxies   发布时间: 2011-09-08

select * from test a left join test1 b on a.id = b.id and a.t = 'a'结果为
ID T ID
1 a 1
2 a 2
3 a
1 b

select * from test a,test1 b where a.id=b.id(+) and a.t='a'结果为:

ID T ID
1 a 1
2 a 2
3 a

显然不对啊,求高手啊!!

作者: rainxies   发布时间: 2011-09-08

你要什么样的结果。是要这个吗?select * from test a,test1 b where b.id=a.id(+) and a.t='a'

作者: yangqm22   发布时间: 2011-09-08

我把建表SQL贴出来,大家试试看就知道了,没你们说的那么简单

CREATE TABLE "TEST" 
  ( "ID" NUMBER, 
"T" VARCHAR2(50)
  );
   
  CREATE TABLE "TEST1" 
  ( "ID" NUMBER, 
  );
   
insert into test values(1,'a');
insert into test values(1,'b');
insert into test values(2,'a');
insert into test values(3,'a');
insert into test1 values(1);
insert into test1 values(2);

我要的结果是(就是最后一行的B_ID为空):

A_ID A_T B_ID
1 a 1
2 a 2
3 a
1 b

作者: rainxies   发布时间: 2011-09-08

我把建表SQL贴出来,大家试试看就知道了,没你们说的那么简单

CREATE TABLE "TEST"
( "ID" NUMBER,
"T" VARCHAR2(50)
);

CREATE TABLE "TEST1"
( "ID" NUMBER,
);

insert into test values(1,'a');
insert into test values(1,'b');
insert into test values(2,'a');
insert into test values(3,'a');
insert into test1 values(1);
insert into test1 values(2);

我要的结果是(就是最后一行的B_ID为空):

A_ID A_T B_ID
1 a 1
2 a 2
3 a
1 b

作者: rainxies   发布时间: 2011-09-08

其实,我觉得你自己的逻辑本身就有点问题
你要求 a.t = 'a'
但是你要的结果里,a.t 有等于 b 的,这个是你想要的吗?

作者: opps_zhou   发布时间: 2011-09-08

你参考下  
在使用left jion时,on和where条件的区别如下:

1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

select * from test a
left join test1 b 
on a.id = b.id and a.t = 'a'

2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

select * from test a,test1 b
 where a.id=b.id(+)
  and a.t = 'a';



select * from test a
left join test1 b 
on a.id = b.id 
where a.t = 'a'

一样




作者: reg13141   发布时间: 2011-09-08

这个跟逻辑没任何关系,这是事务需要哦
你仔细看过了,a.t=b的也是需要的,左表所有data都需要

作者: rainxies   发布时间: 2011-09-08

reg13141说的我知道,但是如何实现我的需求呢?

作者: rainxies   发布时间: 2011-09-08

SQL code

select a.id, a.t, decode(a.t, 'a', b.id) as b_id
  from test a, test1 b
 where a.id = b.id(+);



作者: opps_zhou   发布时间: 2011-09-08

热门下载

更多