admin 管理员组文章数量: 887031
【Oracle】SQL 数据求交集 去重 性能 join, union, unionAll, distinct, ROWID, ROW
.asp
SQL UNION 和 UNION ALL 操作符
- SQL Full Join
- SQL Select Into
SQL UNION 操作符
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
SQL UNION 语法
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
SQL UNION ALL 语法
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。
下面的例子中使用的原始表:
Employees_China:
E_ID | E_Name |
---|---|
01 | Zhang, Hua |
02 | Wang, Wei |
03 | Carter, Thomas |
04 | Yang, Ming |
Employees_USA:
E_ID | E_Name |
---|---|
01 | Adams, John |
02 | Bush, George |
03 | Carter, Thomas |
04 | Gates, Bill |
使用 UNION 命令
实例
列出所有在中国和美国的不同的雇员名:
SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA
结果
E_Name |
---|
Zhang, Hua |
Wang, Wei |
Carter, Thomas |
Yang, Ming |
Adams, John |
Bush, George |
Gates, Bill |
注释:这个命令无法列出在中国和美国的所有雇员。在上面的例子中,我们有两个名字相同的雇员,他们当中只有一个人被列出来了。UNION 命令只会选取不同的值。
UNION ALL
UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值。
SQL Statement 1
UNION ALL
SQL Statement 2
使用 UNION ALL 命令
实例:
列出在中国和美国的所有的雇员:
SELECT E_Name FROM Employees_China
UNION ALL
SELECT E_Name FROM Employees_USA
结果
E_Name |
---|
Zhang, Hua |
Wang, Wei |
Carter, Thomas |
Yang, Ming |
Adams, John |
Bush, George |
Carter, Thomas |
Gates, Bill |
.asp
原
oracle 使用start with connect by nocycle prior 和UnionAll
2013年01月08日 11:39:36 叶修涛 阅读数:3589
当你使用UnionAll的时候 也需要多考虑下性能 提取共有的
比如我这次是做 需要通过 AC1 BC2 C3 其中C1=C2=C3 的C3获取到 BC1和AC2中的C
那么我之前的做法是 分别 AC1 join C3 和 用例串BC2 join C3 分别做 然后unionAll
但是后来我发现 可以 先把所有的关联关系 AC1 join BC2
在 unionAll C3 那么这样就会少了几次jion 会比起以前的快
还有 用UnionAll 不要用Union 因为 Union性能很差 最后可以用distinct
当你用 start with connect by nocycle prior 来执行 递归的时候 加一个nocycle 可以避免死循环
原
SQL根据某列或几列分组去重——row_number() over(partition by)的用法
2018年08月27日 10:55:17 wbj3106 阅读数:443
如需转载,请注明来源,谢谢合作。
若本文对您有一点点的帮助,欢迎点赞、评论和关注。您的鼓励和支持是我继续学习和分享的动力。
推荐免费、高效、入门级的SQL教程.asp
有时利用SQL进行数据处理会发现,要根据某列或某几列选取信息,由于其他列不同而出现了多次,如运行程序1的结果图1:
程序1:
--程序1:要解决的问题
select a.*from AShareEarningEst awhere a.S_INFO_WINDCODE in ('000650.SZ')and a.REPORTING_PERIOD = 20181231
order by a.RESEARCH_INST_NAME,a.EST_DT
- 1
- 2
- 3
- 4
- 5
- 6
图1
我们看到,在AShareEarningEst(中国A股盈利预测明细)表中,共有12人次的证券公司研究员,对000650.SZ(仁和药业)公司的20181231报告期进行预测。例:华泰证券的杨烨辉在20160420、20160428和20160622分别对000650.SZ(仁和药业)发布研究报告进行了预测。现在,我们只需要同一家证券公司的同一个研究员(此处假定同一家证券公司的研究员姓名相同时,即为同一个研究员)做出的最新预测数据,即根据证券公司名称、研究员姓名,同时根据估计日期进行筛选。
此时,可根据row_number() over(partition by)进行处理,运行程序2结果如图2:
程序2:
--程序2:最终解决问题的程序
select b.*
from (select row_number() over(partition by a.RESEARCH_INST_NAME,a.ANALYST_NAME order by est_dt desc) as rn,--根据RESEARCH_INST_NAME(证券公司名称)和ANALYST_NAME(研究员名字)进行分类,--同时根据est_dt(估计日期)倒序排序,即最新日期排在同一分类的上方,此时构建出rn为a.*from wdzx.AShareEarningEst awhere a.S_INFO_WINDCODE in ('000650.SZ') --, '000951.SZ', '600006.SH', '600166.SH')and a.REPORTING_PERIOD = 20181231) b --将分类后的程序构成表b。可以先运行b的程序观察结果where b.rn = 1--运用表b的结果进行子查询,rn=1即为所需结果
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
图2
此时,即主要利用了row_number() over(partition by)函数筛选出了去重后的结果。
收藏
分享
本文标签: OracleSQL 数据求交集 去重 性能 join union unionAll distinct ROWID
版权声明:本文标题:【Oracle】SQL 数据求交集 去重 性能 join, union, unionAll, distinct, ROWID, ROW 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1731158723h1455052.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论