如:
表1:test1
NAME ID
----------- ---------
a 1
a 2
a 3
a 4 表2:test2 ID VALUE
---------- ----------
1 good
2 good
1 bad
2 bad
3 bad
4 bad
5 bad
3 nothingtest1和test2关联后的结果:
NAME VALUE
---------- ----------
a good也就是说test2中的id必须是test1的id的子集,两表才关联成功。其中test1的数据量为2亿条记录左右。test2的数据量在10万条记录左右。
各位能否提供一个高效的方法完成此功能。
解决方案 »
- JDBC连接oracle 出问题:Listener refused the connection! 高手请进~~
- oracle 查询问题
- 用Oracl.DataAccess.Client.OracleConnection出现异常ORA-12154:TNS:无法解析指定的连接标识符
- 用PL/SQL语句改掉所有表中包含一个字段的语句 问题
- 一个表和多个表进行左连接的问题?? 在线等,急!!!!!!!!!! 没有分了 有好心人帮帮忙么?
- 对一个表执行SELECT语句后得到一个结果集,如何从这个结果集中得到这个表的所有字段名和所有字段的类型?
- 怎么删除全部记录的一个字段值呢?
- 简单的删除更新问题,谢谢!
- 提一个刚从SQLSERVER转到ORACLE人都要遇到的问题,100分(我只能给100分)谢谢大家帮忙。
- 求救!
- 请问大家一个通过一张表更新另一张表的问题,大家帮帮忙啊
- not exists 子句 select 什么效率最高
from test1 a,test2 b
where a.id(+)=b.id
group by a.name,b.value
having count(decode(a.id,null,1))=0
各位能否提供一个高效的方法完成此功能。 这么大的数据量能查询出来就不错了.
我做了测试,结果还是不对。
SQL> SELECT a.name,b.value
2 FROM test1 a,test2 b
3 WHERE a.id(+)=b.id
4 GROUP BY a.name,b.value
5 HAVING count(decode(a.id,null,1))=0; NAME VALUE
---------- ----------
a good
a badElapsed: 00:00:00.01
from test1 a,test2 b
where a.id(+)=b.id
group by b.value
having count(decode(a.id,null,1))=0
现在可以完成功能。但是有个问题:如果有n个name,对应1个value。并且满足关系,一个max的结果就会导致只能在n个有效结果集中得到1条记录。
为了解决n个nanme对应1个value的问题。我又添加几个字段。
test1:
NAME ID
---------- ----------
a 1
a 2
a 3
a 4
b 1
b 2
b 3
b 4
c 1
c 2
c 3
c 4
c 5
在这种情况下name='a','b'都对应value='good',name='c'的数据是为了验证1个name对应n个value的情况。
代码如下:
SELECT a.name, b.value
FROM test1 a,
(
SELECT b.id, b.value, COUNT(*) OVER(PARTITION BY b.value) AS cnt
FROM test2 b
)b
WHERE a.id = b.id
GROUP BY a.name, b.value
HAVING COUNT(*) = MIN(b.cnt);结果如下:
NAME VALUE
---------- ----------
b good
a good
c good
c bad这样应该能得到正确的结果。
其中test2是几十万的数据量,对这个数据量做row_number()的效率不会很差。(也可以在实际应用中先做个临时表)。
但最后还是要在2亿的数据量上进行group by。我想到的方法是没办法避免group by操作的。
这是我能想到的最有效的方法了。
我们要群策群力看看有没有更高效的方法。可能还有些特殊情况我没有考虑清楚,如有遗漏的地方还请各位指正,争取把这个问题完全解决。
要尽量少对大表进行遍历读取,可以利用下test2 这个相对较小的表
要避免group by或distinct操作很难