最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

【Oracle】SQL 数据求交集 去重 性能 join, union, unionAll, distinct, ROWID, ROW

网站源码admin3浏览0评论

【Oracle】SQL 数据求交集 去重 性能 join, union, unionAll, distinct, ROWID, ROW

【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_IDE_Name
01Zhang, Hua
02Wang, Wei
03Carter, Thomas
04Yang, Ming

Employees_USA:

E_IDE_Name
01Adams, John
02Bush, George
03Carter, Thomas
04Gates, 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)函数筛选出了去重后的结果。

 收藏 

 分享

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

发布评论

评论列表(0)

  1. 暂无评论