这个sql咋写?

本文介绍如何使用SQL查询两个具有相似结构的表之间的数据差异。通过不同的JOIN操作和NULL值处理技巧,展示如何找出两表中相同列的数据差异及独有的记录。

这个sql咋写?

两个表的结构一模一样,数据大部分是重复,小部分不同;

要求:

1.如果a列数据相同,计算b列相减的结果

test1:

a b

xxx 1

yyy 2

zzz 3

test2

a b

xxx 3

zzz 2

qqq 1

查询结果结果为:

a b

xxx 2

zzz -1

yyy -2

qqq 1

Create Table:

CREATE TABLE test1(a VARCHAR2(20),b NUMBER); CREATE TABLE test2(a VARCHAR2(20),b NUMBER); INSERT INTO test1 VALUES('xxx',1); INSERT INTO test1 VALUES('yyy',2); INSERT INTO test1 VALUES('zzz',3); INSERT INTO test2 VALUES('xxx',3); INSERT INTO test2 VALUES('zzz',2); INSERT INTO test2 VALUES('qqq',1); SELECT * FROM test1; SELECT * FROM test2;

Solution 1:

SELECT a ,SUM(c) AS b FROM (SELECT a ,-1 * b AS c FROM test1 UNION ALL SELECT a ,b AS c FROM test2) GROUP BY a; A B -------------------- ---------- yyy -2 zzz -1 xxx 2 qqq 1

Solution 2:

SELECT nvl(t2.a, t1.a) a ,(nvl(t2.b, 0) - nvl(t1.b, 0)) b FROM test2 t2 FULL OUTER JOIN test1 t1 ON (t2.a = t1.a); A B -------------------- ---------- xxx 2 yyy -2 zzz -1 qqq 1

来自:CU-ORALCE群

JOIN复习:

SQL> SELECT nvl(t2.a, t1.a) a 2 ,(nvl(t2.b, 0) - nvl(t1.b, 0)) b 3 FROM test2 t2 4 RIGHT JOIN test1 t1 ON (t2.a = t1.a); A B -------------------- ---------- xxx 2 zzz -1 yyy -2 SQL> SQL> SELECT nvl(t2.a, t1.a) a 2 ,(nvl(t2.b, 0) - nvl(t1.b, 0)) b 3 FROM test2 t2,test1 t1 4 WHERE t2.a(+) = t1.a; A B -------------------- ---------- xxx 2 zzz -1 yyy -2

SQL> SELECT nvl(t2.a, t1.a) a 2 ,(nvl(t2.b, 0) - nvl(t1.b, 0)) b 3 FROM test2 t2 4 LEFT JOIN test1 t1 ON (t2.a = t1.a); A B -------------------- ---------- xxx 2 zzz -1 qqq 1 SQL> SQL> SELECT nvl(t2.a, t1.a) a 2 ,(nvl(t2.b, 0) - nvl(t1.b, 0)) b 3 FROM test2 t2,test1 t1 4 WHERE t2.a = t1.a(+); A B -------------------- ---------- xxx 2 zzz -1 qqq 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值