请教oracle的SQL写法
有表1,表2两张表,
表1:
业务需求是实现优先从table1中选择记录,如果table1中不存在,
则从table2中选择记录,并且过滤掉table1中已经存在的记录。
那么可以使用UNION ALL和NOT EXISTS结合的方式来实现。
具体的SQL语句如下:
SELECT * FROM table1
UNION ALL
SELECT * FROM table2 t2
WHERE NOT EXISTS (
SELECT 1 FROM table1 t1
WHERE t1.季度= t2.季度 AND t1.地区 = t2.地区
);
在这个SQL语句中,首先使用UNION ALL将table1和table2进行合并。
其中,第一个SELECT语句选择了table1中的所有数据。
第二个SELECT语句选择了table2中不存在于table1中的数据,
并且使用NOT EXISTS来判断table2中的记录是否存在于table1中。
(这里的判断条件用的是季度 和地区,可根据实际情况修改)
如果存在,则过滤掉;如果不存在,则将其合并到结果集中。
TESTCASE:
SQL> -- 建表1
SQL> create table table1 (
2 季度 number,
3 日期 date,
4 地区 varchar2(10),
5 销售额 number
6 );
表已创建。
SQL> -- 插入数据1
SQL> insert into table1 values (1, to_date('2023-02-28', 'yyyy-mm-dd'), '广东', 2000);
已创建 1 行。
SQL> insert into table1 values (1, to_date('2023-02-28', 'yyyy-mm-dd'), '广西', 2000);
已创建 1 行。
SQL> insert into table1 values (2, to_date('2023-04-30', 'yyyy-mm-dd'), '广东', 2000);
已创建 1 行。
SQL> insert into table1 values (2, to_date('2023-04-30', 'yyyy-mm-dd'), '广西', 2000);
已创建 1 行。
SQL> commit;
提交完成。
SQL> -- 建表2
SQL> create table table2 (
2 季度 number,
3 日期 date,
4 地区 varchar2(10),
5 销售额 number
6 );
表已创建。
SQL> -- 插入数据2
SQL> insert into table2 values (1, to_date('2023-02-01', 'yyyy-mm-dd'), '广东', 1000);
已创建 1 行。
SQL> insert into table2 values (1, to_date('2023-02-02', 'yyyy-mm-dd'), '广东', 1000);
已创建 1 行。
SQL> insert into table2 values (1, to_date('2023-02-03', 'yyyy-mm-dd'), '广西', 1000);
已创建 1 行。
SQL> insert into table2 values (1, to_date('2023-02-04', 'yyyy-mm-dd'), '广西', 1000);
已创建 1 行。
SQL> insert into table2 values (2, to_date('2023-04-01', 'yyyy-mm-dd'), '广东', 1000);
已创建 1 行。
SQL> insert into table2 values (2, to_date('2023-04-02', 'yyyy-mm-dd'), '广西', 1000);
已创建 1 行。
SQL> insert into table2 values (3, to_date('2023-07-01', 'yyyy-mm-dd'), '广东', 1800);
已创建 1 行。
SQL> insert into table2 values (3, to_date('2023-07-02', 'yyyy-mm-dd'), '广西', 1800);
已创建 1 行。
SQL> commit;
提交完成。
SQL> SELECT * FROM table1
2 UNION ALL
3 SELECT * FROM table2 t2
4 WHERE NOT EXISTS (
5 SELECT 1 FROM table1 t1
6 WHERE t1.季度= t2.季度 AND t1.地区 = t2.地区
7 );
季度 日期 地区 销售额
---------- -------------- ---------- ----------
1 28-2月 -23 广东 2000
1 28-2月 -23 广西 2000
2 30-4月 -23 广东 2000
2 30-4月 -23 广西 2000
3 01-7月 -23 广东 1800
3 02-7月 -23 广西 1800
已选择 6 行。
SQL>
或者
SQL> SELECT * FROM table1
2 UNION ALL
3 SELECT * FROM table2 t2
4 WHERE t2.季度 not in (SELECT t1.季度 FROM table1 t1 )
5 ;
季度 日期 地区 销售额
---------- -------------- ---------- ----------
1 28-2月 -23 广东 2000
1 28-2月 -23 广西 2000
2 30-4月 -23 广东 2000
2 30-4月 -23 广西 2000
3 01-7月 -23 广东 1800
3 02-7月 -23 广西 1800
已选择 6 行。
SQL>
左链接,然后用NVL(expr1,expr2)函数。
NVL参数含义是:如果第一个参数为null那么显示第二个参数的值,如果第一个参数的值不为null,则显示第一个参数本来的值。expr1用表1的字段,expr2用表2的字段。