ORACLE sql两表关联查询询

Oracle两张表关联批量更新其中一张表的数据
转载 &更新时间:日 09:44:58 & 作者:回憶′亂人心
本文给大家分享两种方法解决Oracle两张表关联批量更新其中一张表的数据,方法非常简单,具有参考借鉴价值,需要的的朋友参考下吧
方法一(推荐):
UPDATE 表2
SET 表2.C =
WHERE 表1.A = 表2.A)
WHERE EXISTS
WHERE 表1.A = 表2.A);
尤其注意最后的外层where条件尤为重要,是锁定其批量更新数据的范围。
MERGE INTO 表2
ON (表2.A = 表1.A)
-- 条件是 A 相同
WHEN MATCHED
UPDATE SET 表2.C = 表1.B
-- 匹配的时候,更新
以上所述是小编给大家介绍的Oracle两张表关联批量更新其中一张表的数据,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具oracle 多表联合查询
http://blog.csdn.net/rosekin/article/details/
此时如果要对分组后的数据再次进行过滤,则使用HAVING子句完成,那么此时的SQL语法格式如下:
SELECT [DISTINCT] *|分组字段1 [别名] [,分组字段2 [别名] ,…] | 统计函数
FROM 表名称 [别名], [表名称 [别名] ,…]
[WHERE 条件(s)]
[GROUP BY 分组字段1 [,分组字段2 ,…]]
[HAVING 分组后的过滤条件(可以使用统计函数)]
[ORDER BY 排序字段 ASC | DESC [,排序字段 ASC | DESC]];
下面使用HAVING进行过滤。SELECT d.deptno,d.dname,d.loc,COUNT(e.empno) mycount,NVL(AVG(e.sal),0) myavg
FROM dept d,emp e
WHERE d.deptno=e.deptno(+)
GROUP BY d.deptno,d.dname,d.loc
HAVING AVG(sal)&2000;注意点:WHERE和HAVING的区别WHERE:是在执行GROUP BY操作之前进行的过滤,表示从全部数据之中筛选出部分的数据,在WHERE之中不能使用统计函数;HAVING:是在GROUP BY分组之后的再次过滤,可以在HAVING子句中使用统计函数;五、子查询子查询 = 简单查询 + 限定查询 + 多表查询 + 统计查询的综合体;在之前强调过多表查询不建议大家使用,因为性能很差,但是多表查询最有利的替代者就是子查询,所以子查询在实际的开发之中使用的相当的多;所谓的子查询指的就是在一个查询之中嵌套了其他的若干查询,嵌套子查询之后的查询SQL语句如下:SELECT [DISTINCT] *|分组字段1 [别名] [,分组字段2 [别名] ,…] | 统计函数 ,(
SELECT [DISTINCT] *|分组字段1 [别名] [,分组字段2 [别名] ,…] | 统计函数
FROM 表名称 [别名], [表名称 [别名] ,…]
[WHERE 条件(s)]
[GROUP BY 分组字段1 [,分组字段2 ,…]]
[HAVING 分组后的过滤条件(可以使用统计函数)]
[ORDER BY 排序字段 ASC | DESC [,排序字段 ASC | DESC]])
FROM 表名称 [别名], [表名称 [别名] ,…] ,(
SELECT [DISTINCT] *|分组字段1 [别名] [,分组字段2 [别名] ,…] | 统计函数
FROM 表名称 [别名], [表名称 [别名] ,…]
[WHERE 条件(s)]
[GROUP BY 分组字段1 [,分组字段2 ,…]]
[HAVING 分组后的过滤条件(可以使用统计函数)]
[ORDER BY 排序字段 ASC | DESC [,排序字段 ASC | DESC]])
[WHERE 条件(s) (
SELECT [DISTINCT] *|分组字段1 [别名] [,分组字段2 [别名] ,…] | 统计函数
FROM 表名称 [别名], [表名称 [别名] ,…]
[WHERE 条件(s)]
[GROUP BY 分组字段1 [,分组字段2 ,…]]
[HAVING 分组后的过滤条件(可以使用统计函数)]
[ORDER BY 排序字段 ASC | DESC [,排序字段 ASC | DESC]])]
[GROUP BY 分组字段1 [,分组字段2 ,…]]
[HAVING 分组后的过滤条件(可以使用统计函数)]
[ORDER BY 排序字段 ASC | DESC [,排序字段 ASC | DESC]];理论上子查询可以出现在查询语句的任意位置上,但是从个人而言,子查询出现在WHERE和FROM子句之中较多;以下的使用特点为个人总结,不是官方声明的:WHERE:子查询一般只返回单行列、多行单列、单行多列的数据;FROM:子查询返回的一般是多行的数据,当作一张临时表出现。&strong&内连接&/strong& 同时显示部门名称和员工信息。Select两个表的写法,内连接。公共匹配的 数据 简化的写法 Dept表,employee表 Select d.name,e.name,sex from employee e,dept d where e.id=d.id 标准的写法: Select d.name,e.name,sex from employee e join dept d on e.id=d.id
&strong&外连接:&/strong& 左连接: 左边员工表的记录全部显示。右边表只显示匹配的,相同的部分显示一次 Select d.name,e.name,sex from employee e,dept d where e.id=d.id(+) 右连接正好相反 左连接和右连接合成为外连接
&strong&子查询&/strong& In写法和下面的exists是一个意思 Select * from employee e where id not in (select id from dept where id=’3’); Select * from employee e where id in (select id from dept where id=’3’);
Exists写法和上面的in是一个意思,exists可以用*来匹配。 Select * from employee e where not exists (select * from d where id=e.id) Select * from employee e where exists (select id from d where id=e.id)
union合并行数据,只是显示,不变化物理数据 select id from e union
相同的行数据合并。不同的只显示一次
&u&将两个表中合并显示。只是显示相同的行数据&/u& Select id from e Intersect Select id from d
&strong&用别的表的结果集插入到别的表中&/strong& Insert into e(eid,ename) select id,
&strong&复制表&/strong& 将一行数据放进去表中,把已有表的字段和数据行 放到一个表中用来复制 Create table ttt as select e.id,e.name from e where eid=’001’
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!16:43 提问
oracle数据库中有多张表,如何查看其中两个表之间是否存在关联,以及他们关联的字段。
我目前用的是pl/sql对数据库进行操作,数据库中大概有几百张表,我想看看这些表之间有没有关联关系(我需要用到的两张表有没有关联关系以及是通过那些字段关联的)。我试着用网上的方法:新建一个diagram window,然后把我想查看的两张表托进去,问题我看不太懂这里面的关系。望各位大神告知啊。
按赞数排序
你可以用软件 PowerDesigner 查看各表之间的关系。
一般情况下都是_id进行两个表的关联,你可以看看
select a.constraint_name, a.table_name, b.constraint_name
from dba_constraints a, dba_constraints b
where a.constraint_type = 'R'
and b.constraint_type = 'P'
and a.r_constraint_name = b.constraint_name and a.owner='SCOTT';
1.首先Oracle数据库只是一个关系型数据库,当两个表创建的时候是不存在关联关系的。
2.两个表建立起来连接是通过表里的字段进行联系的,举例说明正常表的字段命名,如果用户表fnd_user(user_id,user_name)表和用户权限表 user_authority(auth_id,user_id,auth_name)
然后我们使用的时候用user_id进行关联起来。
3.表与表之后的关联关系要放到应用场景中进行考虑。可能会容易理出来。
你可以在Navicat里面点击查看ER图标,有关联的会有线相连。
是否存在关联,这要看设计表的人是如何设计的;
如果使用了外键,那么直接通过外键就可以看出是否存在关联;
如果没有使用外键,而是要根据列名机规则了,比如:
用户表(id, name, time),登录记录表(id,用户表_id,ip,time),
注意到字段“用户表_id”了吧,如果是外键(注意:这里称作外键,但并在数据库中建立外键约束)则添加表名前缀。
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐Oracle-多表连接的三种方式解读
-多表连接的三种方式解读概述
在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式。
下面是从10053事件中截取的部分trace原文件。
Join order[2]: T[T]#1 T1[T1]#0
........省略
Best NL cost: 574.45
resc: 574.45 resc_io: 567.00 resc_cpu:
resp: 574.45 resp_io: 567.00 resc_cpu:
..........省略
SM cost: 10.08
resc: 10.08 resc_io: 9.00 resc_cpu:
resp: 10.08 resp_io: 9.00 resp_cpu:
..........省略
HA cost: 9.10
resc: 9.10 resc_io: 9.00 resc_cpu: 2810323
resp: 9.10 resp_io: 9.00 resp_cpu: 2810323
Join order aborted: cost & best plan cost
***********************
可以发现多表之间的连接方式有三种连接方式NL Join 、 SM Join、 HA Join。
Nested Loops,Hash Join 和 Sort Merge Join.
三种连接方式
NESTED LOOP
对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择。
在嵌套循环中,内表被外表驱动,外表返回的每一行都要在内表中检索找到与它匹配的行,因此整个查询返回的结果集不能太大(大于1 万不适合),要把返回子集较小表的作为外表(CBO 默认外表是驱动表),而且在内表的连接字段上一定要有索引。当然也可以用ORDERED 提示来改变CBO默认的驱动表,
使用USE_NL(table_name1 table_name2)可是强制CBO 执行嵌套循环连接。
Nested loop一般用在连接的表中有索引,并且索引选择性较好的时候.
步骤:确定一个驱动表(outer table),另一个表为inner table,驱动表中的每一行与inner表中的相应记录JOIN。类似一个嵌套的循环。
适用于驱动表的记录集比较小(&10000)而且inner表需要有有效的访问方法(Index)。
需要注意的是:JOIN的顺序很重要,驱动表的记录集一定要小,返回结果集的响应时间是最快的。
Sort Merge Join
通常情况下散列连接的效果都比排序合并连接要好,然而如果行源已经被排过序,在执行排序合并连接时不需要再排序了,这时排序合并连接的性能会优于散列连接。
可以使用USE_MERGE(table_name1 table_name2)来强制使用排序合并连接.
Sort Merge join 用在没有索引,并且数据已经排序的情况.
步骤:将两个表排序,然后将两个表合并。
通常情况下,只有在以下情况发生时,才会使用此种JOIN方式:
1.RBO模式 2.不等价关联(&,&,&=,&=,&&) 3.HASH_JOIN_ENABLED=false 4.数据源已排序
散列连接(Hash Join )是CBO 做大数据集连接时的常用方式,优化器使用两个表中较小的表(或数据源)利用连接键在内存中建立散列表,然后扫描较大的表并探测散列表,找出与散列表匹配的行。
这种方式适用于较小的表完全可以放于内存中的情况,这样总成本就是访问两个表的成本之和。但是在表很大的情况下并不能完全放入内存,这时优化器会将它分割成若干不同的分区,不能放入内存的部分就把该分区写入磁盘的临时段,此时要有较大的临时段从而尽量提高I/O 的性能。
也可以用USE_HASH(table_name1 table_name2)提示来强制使用散列连接.
Hash join用在两个表的数据量差别很大的时候.
步骤:将两个表中较小的一个在内存中构造一个HASH表(对JOIN KEY),扫描另一个表,同样对JOIN KEY进行HASH后探测是否可以JOIN。适用于记录集比较大的情况。
需要注意的是:如果HASH表太大,无法一次构造在内存中,则分成若干个partition,写入磁盘的temporary segment,则会多一个写的代价,会降低效率。
三种连接工作方式比较
Hash join的工作方式是将一个表(通常是小一点的那个表)做hash运算,将列数据存储到hash列表中,从另一个表中抽取记录,做hash运算,到hash 列表中找到相应的值,做匹配。
Nested loops 工作方式是从一张表中读取数据,访问另一张表(通常是索引)来做匹配,nested loops适用的场合是当一个关联表比较小的时候,效率会更高。
Merge Join 是先将关联表的关联列各自做排序,然后从各自的排序表中抽取数据,到另一个排序表中做匹配,因为merge join需要做更多的排序,所以消耗的资源更多。 通常来讲,能够使用merge join的地方,hash join都可以发挥更好的性能。查看: 3447|回复: 6
求帮看看;查询语句如何实现一对多的主表关联细表的求和某个字段的查询
论坛徽章:4
本帖最后由 gliu12 于
14:41 编辑
现在主表是这样的
select '2007' 年份, 10000.43 amt from dual
select '2008' 年份, 9999.43 amt from dual
细表是下面这样的
select '第一季度' 季度, '2007' 年份, 2329.63 amt from dual
select '第二季度' 季度, '2007' 年份, 2671.5 amt from dual
select '第三季度' 季度, '2007' 年份, 2428.8 amt from dual
select '第四季度' 季度, '2007' 年份, 2571.5 amt from dual
select '第一季度' 季度, '2008' 年份, 2329.63 amt from dual
select '第二季度' 季度, '2008' 年份, 2671.5 amt from dual
select '第三季度' 季度, '2008' 年份, 2428.8 amt from dual
select '第四季度' 季度, '2008' 年份, 2570.5 amt from dual
我做了一个关联查询查询的结果如图
4.png (21.32 KB, 下载次数: 0)
14:30 上传
现在想在做关联查询的时候求出 年金额与 月金额的和,我是这么写SQL的,但是不对,截图如下
3.png (16.75 KB, 下载次数: 3)
14:39 上传
请各位帮看看该如何去写这个SQL
(16.75 KB, 下载次数: 11)
14:34 上传
sql查询结果
论坛徽章:4
补充后面一个截图,后面的截图掉了
(16.75 KB, 下载次数: 0)
14:42 上传
论坛徽章:4
好像多套一层壳子是可以的
with gh as
(select t.amt, t.年份, sum(round(d.amt)) 月金额
& & from (select '2007' 年份, 10000.43 amt
& && && && &from dual
& && && & union all
& && && & select '2008' 年份, 9999.43 amt from dual) t,
& && && &(select '第一季度' 季度, '2007' 年份, 2329.63 amt
& && && && &from dual
& && && & union all
& && && & select '第二季度' 季度, '2007' 年份, 2671.5 amt
& && && && &from dual
& && && & union all
& && && & select '第三季度' 季度, '2007' 年份, 2428.8 amt
& && && && &from dual
& && && & union all
& && && & select '第四季度' 季度, '2007' 年份, 2571.5 amt
& && && && &from dual
& && && & union all
& && && & select '第一季度' 季度, '2008' 年份, 2329.63 amt
& && && && &from dual
& && && & union all
& && && & select '第二季度' 季度, '2008' 年份, 2671.5 amt
& && && && &from dual
& && && & union all
& && && & select '第三季度' 季度, '2008' 年份, 2428.8 amt
& && && && &from dual
& && && & union all
& && && & select '第四季度' 季度, '2008' 年份, 2570.5 amt from dual) d
& &where t.年份 = d.年份
& &group by t.amt, t.年份)
select sum(gh.amt) 年金额, sum(gh.月金额) from gh
求职 : 招聘 : 认证徽章论坛徽章:6341
贴的图都看不见。。。。。。
论坛徽章:11
select sum1,sum2 from (
select sum1,sum2,ROW_NUMBER()over(order by rn desc) rr from (
select t.年份 yy,d.季度 jj,t.amt yamt,d.amt mamt,rownum rn
& & from (select '2007' 年份, 10000.43 amt
& && && && &from dual
& && && & union all
& && && & select '2008' 年份, 9999.43 amt from dual) t,
& && && &(select '第一季度' 季度, '2007' 年份, 2329.63 amt
& && && && &from dual
& && && & union all
& && && & select '第二季度' 季度, '2007' 年份, 2671.5 amt
& && && && &from dual
& && && & union all
& && && & select '第三季度' 季度, '2007' 年份, 2428.8 amt
& && && && &from dual
& && && & union all
& && && & select '第四季度' 季度, '2007' 年份, 2571.5 amt
& && && && &from dual
& && && & union all
& && && & select '第一季度' 季度, '2008' 年份, 2329.63 amt
& && && && &from dual
& && && & union all
& && && & select '第二季度' 季度, '2008' 年份, 2671.5 amt
& && && && &from dual
& && && & union all
& && && & select '第三季度' 季度, '2008' 年份, 2428.8 amt
& && && && &from dual
& && && & union all
& && && & select '第四季度' 季度, '2008' 年份, 2570.5 amt from dual) d
& &where t.年份 = d.年份 order by t.年份 asc,d.季度 asc) dd model&&DIMENSION BY (rn)
&&MEASURES (yy,yamt,mamt,0 sum1,0 sum2)
&&sum1[any] order by rn=nvl(sum1[cv()-1],0)+case when yy[cv(rn)]=yy[cv(rn)-1] then 0 else yamt[cv(rn)] end,
&&sum2[any]&&order by rn=nvl(sum2[cv()-1],0)+mamt[cv()]
&&))) where rr=1
论坛徽章:496
第二张表要先汇总然后才连接第一张表。
论坛徽章:5
静观你写复杂sql,愁啊
itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有    
 北京市公安局海淀分局网监中心备案编号:10 广播电视节目制作经营许可证:编号(京)字第1149号

我要回帖

更多关于 数据库两个表关联查询 的文章

 

随机推荐