所以我有一个带有一堆成员信息(700万条记录)的数据库,我可以从中提取信息。然后在一个单独的系统中,我有一个800K emials的列表。我想要做的是将数据库中的所有成员与此800K电子邮件列表进行匹配。我没有能力使用这些电子邮件在数据库中创建一个表 - 我只能从数据库中读取。
所以我的问题是,最好的方法是什么?我是否可以编写一个sql语句,从csv文件中读取这些800k到内存中,然后执行查找与此列表进行比较?方法是什么?我只想为那些信息在该外部列表中的成员提取所有emmebr信息...
由于
答案 0 :(得分:0)
如果您有可用的DDL访问权限的单独Oracle数据库,则可以尝试使用只读帐户在两个数据库之间创建DB Link。
CREATE DATABASE LINK <DB Link Name>
CONNECT TO <Your read-only account>
IDENTIFIED by <password>
USING <ServiceName or TNS Entry of remote database>;
这使您能够在自己的数据库中构建查询,但引用只读数据库中的700万条记录表:
Select * from
emails e -- your local 800K emails table
Join customers@readonlydatabase c -- read-only table in restricted database
on e.uniqueid = c.uniqueid
根据文档,此设置的先决条件是:
先决条件
要创建专用数据库链接,您必须具有CREATE DATABASE LINK系统特权。要创建公共数据库链接,您必须具有 CREATE PUBLIC DATABASE LINK系统特权。此外,你必须有 远程Oracle数据库的CREATE SESSION系统特权。
必须在本地和远程Oracle上安装Oracle Net 数据库。
另请注意,dblink访问权限仅与其用于连接的帐户一样好。因此,如果您的帐户是只读的,那么您的dblink将保留相同的限制。
答案 1 :(得分:0)
像这样构建一个巨大的SQL语句:
select *
from member_data
join
(
--Add all the text information here.
--
--Up to 32767 values can be stored in this collection.
select column_value email_address from table(sys.odcivarchar2list(
'asdf1@asdf.com',
'qwer1@qwer.com'
--...
))
--Another 32767 values
union all
select * from table(sys.odcivarchar2list(
'asdf2@asdf.com',
'qwer2@qwer.com'
--...
))
--...
) other_system
on member_data.email = other_system.email_address;
它很难看,但它并不难建立,也不需要任何额外的权限。使用一些文本处理技巧,可能是文本编辑器中的正则表达式或使用Excel添加单引号和逗号,该语句可能在几分钟内构建。这么大的SQL语句通常是一个坏主意,但对于一次性过程来说这很好。