oracle能用一条sql做判断吗?

比如我有三张表A B C,A里字段id是B和C里的外键,我想做的效果是查询A表某个id,如果这个id存在于B表就查询B表的数据,如果不存在就查询C表的数据,不用存储过程单SQL能写出来不?

weixin_42609542
weixin_42609542 这是要做数据库路由吗
接近 7 年之前 回复

7个回答

如果A表对B、C表的关系是一对一,那建议采取dzwfeng的方式;
如果是一对多,左连接就会出现B,C表笛卡尔积,因为B,C表之间没有关联关系;
这种情况建议使用union,如:
select A.id,B.name
from A inner join B on A.id=B.id
union
select A.id,C.name
from A inner join C on A.id=C.id
注:是否使用union all决定于你的具体需求

ququjioulai
ququjioulai 最后还是用的union,思路是1,先把a表所有ID查出来,再丢到b表去查询出全部数据,2,a,b用左关联加group by 获取b表中存在的id ,再在a表的id中not in掉,剩下的id就丢c表去查,最后用union组合去重,自己感觉有点复杂,技术不行 sql: select ta.cid from t_a ta left join t_b tb on tb.tsid=ta.tsid where tb.tcid in (1,2,3) union select stuid from t_d where cid in (select cid from T_B where tcid in (1,3,2) and tsid not in (select ta.tsid from t_a ta left join t_b tb on tb.tsid=ta.tsid where tb.tcid in (1,3,2) group by ta.tsid))
接近 7 年之前 回复

1、如果查询的列数少 可以使用case when then

2、因为b/c二者选一,所以可以连表查 然后分组排重

很直接的就是去查每张表 有数据返回 就去查 没有就不去查
还能有什么好的想法?还是我想简单了?

COALESCE函数

在oracle可以用左关联,A和B,C关联,取B表的数据,如果B这个字段数据为空就取C表对应字段的数据。
select nvl(b.字段1,c.字段1)
from a,b,c
where a.id =b.id(+)
and a.id = c.id(+)

如果存在一个id,使得在B、C表同时存在,则楼主所求的一句sql不存在。

可以使用存储过程实现啊

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐