最近回答了几个 CSDN “学习”功能里“问答”区的一些专业相关问题,回答过程中采用严谨的方式,在 Oracle Live SQL 上进行验证测试。这个很好用的 Oracle APEX 应用我使用好几年了,虽然近年来已转行 MySQL 和国产数据库领域,但仍然会遇到一些 Oracle 的问题,在这上面做在线 SQL 测试很方便,遂推荐给各位!
使用此网站可以共享和学习 SQL 和 PL/SQL。 当您使用此网站时,您将被分配访问 Oracle 数据库中的**方案(或称模式,Schema)**的权限。当您运行 SQL 和 PL/SQL 时,会话中的每条语句都会被记录下来。您对分配的方案的访问是临时的,在一段时间不活动后,该方案将被初始化并回收给其他人。要永久保存您的工作,您需要将会话保存为脚本。保存的脚本可以回放、注释、编辑、共享和下载。
此网站的功能包括:
为什么要使用此网站:
Live SQL 当前运行在 Oracle Database 19c EE Extreme Perf-19.17.0.0.0 上。
使用 Oracle Live SQL 时需要登录 Oracle 账号,因此您需要提前注册或新注册一个 Oracle 账号,建议使用 Outlook 等国外邮箱注册(考过 Oracle 认证的应该都知道),虽然国内邮箱也没什么问题,但可能会受政治因素影响。
详见 我的问答 。
SQL 代码如下:
//简化的原问题的等价 SQL 方案
drop table t1;
create sequence seq_t1 start with 1 increment by 1;
create table t1(id number(20) default seq_t1.nextval primary key , code number(10));
insert into t1(code) select level from dual connect by level < 11;
insert into t1(code) select code from t1;
select * from t1 order by code;
select code,count(1) from t1 group by code order by code;
drop table t1 purge;
create table t1(code number(10));
insert into t1(code) select level from dual connect by level < 11;
select distinct code name from t1 order by code;
select (select distinct code name from t1) code from dual; /*这里模拟题主的SQL写法,其实也有问题,应该是题主多打了一个name */
//原问题的 SQL 方案
drop table t_track_pro_code;
drop table ba_bgt_info_hz;
create table t_track_pro_code(track_pro_code varchar2(30),track_pro_code_name varchar2(60));
create table ba_bgt_info_hz(track_pro_code varchar2(30),bgt_id number(16),ori_bgt_id number(16),bgt_doc_title varchar2(100),is_deleted number(1),importtype number(2),billstatus number(2));
insert into ba_bgt_info_hz values('aaa',101,1,'车辆购置税收入补助地方资金',2,1,1);
insert into ba_bgt_info_hz values('aaa',101,1,'title',2,1,1);
insert into ba_bgt_info_hz values('aaa',101,1,'车辆购置税收入补助地方资金',0,1,1);
insert into ba_bgt_info_hz values('aaa',101,1,'车辆购置税收入补助地方资金',2,8,1);
insert into ba_bgt_info_hz values('aaa',101,1,'车辆购置税收入补助地方资金',2,8,-1);
insert into ba_bgt_info_hz values('bbb',102,2,'title',2,1,1);
insert into ba_bgt_info_hz values('ccc',103,3,'车辆购置税收入补助地方资金',2,1,1);
select * from ba_bgt_info_hz;
select * from t_track_pro_code;
//题主原始 SQL
insert into t_track_pro_code (track_pro_code,track_pro_code_name) select (with tb1 as (
select distinct m.track_pro_code from ba_bgt_info_hz m where m.ori_bgt_id in (
select t.bgt_id from ba_bgt_info_hz t where t.track_pro_code in (select distinct track_pro_code from ba_bgt_info_hz
where bgt_doc_title like '%车辆购置税收入补助地方资金%' and is_deleted=2 and track_pro_code is not null and importtype not in (8,9))
and t.billstatus>=0 and t.importtype not in (8,9)
) and m.importtype not in (8,9) union
select distinct track_pro_code from ba_bgt_info_hz
where bgt_doc_title like '%车辆购置税收入补助地方资金%' and is_deleted=2 and track_pro_code is not null and importtype not in (8,9)
) select distinct track_pro_code track_pro_code_name from tb1) track_pro_code,'车辆购置税收入补助地方资金'
track_pro_code_name from dual;
insert into t_track_pro_code (track_pro_code,track_pro_code_name) with temp as (
select distinct track_pro_code from ba_bgt_info_hz
where bgt_doc_title like '%车辆购置税收入补助地方资金%' and is_deleted=2 and track_pro_code is not null and importtype not in (8,9)),
tb1 as (
select distinct m.track_pro_code from ba_bgt_info_hz m where m.ori_bgt_id in (
select t.bgt_id from ba_bgt_info_hz t where t.track_pro_code in (select track_pro_code from temp) and t.billstatus>=0 and t.importtype not in (8,9)
) and m.importtype not in (8,9)
union select track_pro_code from temp /*因前面已经去重了,union也会去重,所以这里无需distinct*/
)
select track_pro_code,'车辆购置税收入补助地方资金' track_pro_code_name from tb1;
除了在线测试 SQL 外,Oracle Live SQL 上还有很多学习 Oracle SQL 的教程,可以很方便的点击一个按钮直接将教程中的代码复制到并在其中运行。这对于学习、从事 Oracle 数据库开发工作的 Oracle Developer 很有帮助。
此外,该网站页脚处也提到了 Ask Tom 和 Dev Gym 相关链接,还有 Oracle Learning Path 等。
`