请教oracle的SQL写法

请教oracle的SQL写法
有表1,表2两张表,
表1:

img


表2:

img


现在想把他们合并在一起,假如表1有季度1和季度2,那么季度1和季度2的数据,那就只取表1的,表2有季度3但表1没有,那么再取表2的,也就是根据季度这个字段判断,优先取表1,表1没有再取表2的。
效果如下:

img


请问SQL应该怎么写呢

业务需求是实现优先从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的字段。