得到相同的记录

本文介绍了一种使用WITH语句和decode函数实现的SQL连接查询方法,该方法能够将两个不同结构的数据表进行有效连接,以生成包含所有类型名称及其对应计数的年份列表。

t1的结构:
year    tname    cnt
-----------------------
2005    type1    10
2005    type3    20
2006    type3    15
2006    type2    30
2007    type2    20

t2的结构
seq       tname
---------------------
  1          type1
  2          type2
  3          type3

如何连接查询两表,得到结果如下:
year    tname   cnt

----------------------------
2005    type1    10
2005    type2   
2005    type3    20
2006    type1   
2006    type2    30
2006    type3    15
2007    type1   
2007    type2    20
2007    type3   

解决方法

WITH a AS (
SELECT '2005' YEAR ,'type1' TYPE ,10 cnt FROM dual
UNION
SELECT '2006' YEAR ,'type1' TYPE ,20 FROM dual
UNION
SELECT '2006' YEAR ,'type2' TYPE ,100 FROM dual
UNION
SELECT '2007' YEAR ,'type1' TYPE ,30 FROM dual
)

SELECT a.year,b.typename,CASE WHEN sum(decode(a.TYPE,b.typename,a.cnt,'0')) = 0 THEN '' WHEN  sum(decode(a.TYPE,b.typename,a.cnt,'0')) >0 THEN ''||sum(decode(a.TYPE,b.typename,a.cnt,'0')) END FROM a a ,(SELECT 'type1' typename FROM dual UNION SELECT  'type2'  FROM dual UNION SELECT 'type3'  FROM dual) b
GROUP BY a.year,b.typename ORDER BY a.year,b.typename

要去除Oracle数据库中两个表之间的相同记录,通常有几种方法可以实现这一目标。这里假设您有两个结构相似的表A和B,并希望从表A中移除那些也存在于表B中的所有记录。 ### 方法一:使用`DELETE`结合`EXISTS` 这是一种常见的做法: ```sql DELETE FROM 表A a WHERE EXISTS ( SELECT 1 FROM 表B b WHERE b.主键字段 = a.主键字段 -- 根据实际情况修改为主键或其他唯一标识符 ); ``` 此SQL语句的作用是从表A中删除掉与表B中有共同主键值的所有行。 ### 方法二:利用`MINUS`操作符创建临时结果集再做处理 如果想要更直观地看到差异部分然后再采取行动的话,你可以先通过`MINUS`得到只有在A中存在的数据: ```sql SELECT * INTO #temp_table FROM ( SELECT * FROM 表A MINUS SELECT * FROM 表B ); -- 然后将#temp_table的数据重新插入到表A(如果有需要) INSERT INTO 表A SELECT * FROM #temp_table; DROP TABLE #temp_table; ``` 注意这种方法适用于比较小规模的数据量,因为涉及到中间表的操作,在大规模数据下性能可能会受到影响。 ### 方法三:直接使用 `MERGE` 或者 `NOT IN` 对于某些特定版本支持的情况下也可以考虑采用如下的方式进行更新: ```sql MERGE INTO 表A USING( WITH temp AS (SELECT 主键字段 FROM 表B) SELECT * FROM temp) t ON(表A.主键字段=t.主键字段) WHEN MATCHED THEN DELETE; ``` 或是简单点的方式就是用 `NOT IN`,不过需要注意当子查询返回NULL的时候会出现不符合预期的结果。 ```sql DELETE FROM 表A WHERE 表A.主键字段 NOT IN (SELECT 主键字段 FROM 表B); ``` 以上就是在Oracle数据库里如何去掉两张表间重复项的一些基本思路和技术手段。具体的方案选择还需要依据您的实际业务场景以及对效率的要求来做最终确定。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值