select * from
A
left outer join
B
on
(
B.b1 < (decode(a.a1, 0, c.c1))
B.b2 = A.a2
);
我知道on里面不能有子查询,也试过写成如下形式
select * from
A
left outer join
B,
C
on
(
B.b2 = A.a2
)
where
B.b1 < (decode(a.a1, 0, c.c1))但是结果都和预期的不一样, 逻辑不能变,请问怎么workaround?
A
left outer join
B
on
(
B.b1 < (decode(a.a1, 0, c.c1))
B.b2 = A.a2
);
我知道on里面不能有子查询,也试过写成如下形式
select * from
A
left outer join
B,
C
on
(
B.b2 = A.a2
)
where
B.b1 < (decode(a.a1, 0, c.c1))但是结果都和预期的不一样, 逻辑不能变,请问怎么workaround?
解决方案 »
- 简述Oracle口令文件的作用,如何创建和使用口令文件
- sql语句执行时是先分析语法还是先去共享池搜索副本
- 一个LDAP的问题,网上有提问,无回答
- 关于ORACLE里边的NVL语句的问题,请教大家,谢谢
- 关掉Oracle8i的managerServer服务之后 无法重起
- 大家给推荐几本学习Oracle的好书
- 请教 Oracle DeveloperForm6i里的一些很菜的问题,关于配置的
- 初学者的问题:如何在OEM中连接远程数据库?
- 就是我的sql+是oracle 9,但是那些builders是装的oracle8,没有装在一个目录里,现在sql+可以连远程数据库,但是那些builders不可以,怎么
- sql的having子句的疑问
- 关于作业的执行
- oracle 10g 汉字时间转换?
SQL> select a.orig_type, s.primary_offer_id from ADJ a left outer join
2 SUBSCRIBER_BILLING S
3 on
4 (
5 S.subscr_no = a.subscr_no AND
6 S.subscr_no_resets = a.subscr_no_resets AND
7 S.active_dt <= a.TRANSACT_DATE AND
8 (S.inactive_dt > a.TRANSACT_DATE OR
9 S.inactive_dt is null)
10 ); ORIG_TYPE PRIMARY_OFFER_ID
---------- ----------------
2 1000313
2
2
2
3 1000313
另一种写法:
select a.orig_type, s.primary_offer_id from ADJ a left outer join
SUBSCRIBER_BILLING S
on
(
S.subscr_no = a.subscr_no AND
S.subscr_no_resets = a.subscr_no_resets
),
(
select TRANSACT_DATE trans_date ,subscr_no,subscr_no_resets from ADJ aj
) trans_table
where
S.active_dt <= trans_table.trans_date AND
(S.inactive_dt > trans_table.trans_date OR
S.inactive_dt is null) AND
S.subscr_no = trans_table.subscr_no AND
S.subscr_no_resets = trans_table.subscr_no_resets;
ORIG_TYPE PRIMARY_OFFER_ID
---------- ----------------
2 1000313
2 1000313
3 1000313
3 1000313
回到最初的问题,那个on里面包含子查询可以怎么改呢?
A
left outer join
B,
C 这是错误的 要连两个表以上要这么写
A LEFT JOIN B ON
LEFT JOIN C ON。 其次 decode(a.a1, 0, c.c1) 这里也错 你A表和C表还没连起来 不能用这样的操作最后 LEFT JOIN 就是 outer 不需要再加这个 outer 了 ,当然加了也没问题
你可以这么写
select *
from A
left join B
on B.b2 = A.a2
left join c
on A 和C 连接的条件
where B.b1 < (decode(a.a1, 0, c.c1))
select *
from A
left join B
on B.b2 = A.a2
left join c
on A 和C 连接的条件
where B.b1 < (decode(a.a1, 0, c.c1))
给五楼做一些补充,改成这样:select *
from A
left join B
on B.b2 = A.a2
left join c
on A 和C 连接的条件
where B.b1 < (decode(a.a1, 0, c.c1)) or B.b1 is null
否则A与B的左外连接将失效。