oracle in用法的一个小问题

oSuperkinG 2016-09-08 07:15:11
现在有这么一些数据,'C005-201609080344','C001-201609080343','C001-201609060317',这是一些订单单号,其中有一些已经作废,我想找到这些作废的单号,B表是支付记录表,里面是所有有效的单号,我想将上述单号数据变成一个结果集使用,这样就可以通过类似如下的sql将失效的单号过滤出来:

select * from ('C005-201609080344','C001-201609080343','C001-201609060317') t where not exists(select 1 from B t2 where t2.bill_no = t.bill_no);

但是上面的sql有语法错误的,想请教下正确的书写格式是什么样的?

当然有各种变通的方法,比如将单号数据存入临时表,通过编写小程序等balabala……,我只是想研究下更加直接的方式来把结果拿到,一行sql能够搞定这个问题。算是一个学习吧,有没有大神能够提供一个正确的书写格式呢?
...全文
2583 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ghx287524027 2016-09-09
  • 打赏
  • 举报
回复
select * from(
select regexp_substr('C005-201609080344,C001-201609080343,C001-201609060317','[^,]+',1,rownum) bill_no from dual
connect by rownum<=length('C005-201609080344,C001-201609080343,C001-201609060317')-length(replace('C005-201609080344,C001-201609080343,C001-201609060317',','))+1
) t
where not exists (select 1 from B t2 where t2.bill_no = t.bill_no)
这样也行,但是当字符串很长的时候看着就比较闹心了
卖水果的net 2016-09-08
  • 打赏
  • 举报
回复

-- 两个方法,各有优势,你自己权衡一下

 -- 1 创建一个 TYPE ,直接 使用 from 方法, 但是,不能超过 999 个值 。
SQL> create type type_list is table of varchar2(60) ;
  2  /
Type created
SQL> select * from table(type_list('C005-201609080344','C001-201609080343','C001-201609060317')) t ;
COLUMN_VALUE
------------------------------------------------------------
C005-201609080344
C001-201609080343
C001-201609060317
SQL> drop type type_list ;
Type dropped


 -- 2 在你的程序中,拼接成 虚拟表,这个数量没有限制
SQL> with m(orderid) as (
  2      select 'C005-201609080344' from dual union all
  3      select 'C001-201609080343' from dual union all
  4      select 'C001-201609060317' from dual
  5  )
  6  select * from m ;
ORDERID
-----------------
C005-201609080344
C001-201609080343
C001-201609060317

SQL> 

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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