我有一个800K电子邮件列表,我想从数据库中检索,我只读取访问权限 - 我该怎么做?

时间:2016-01-14 17:15:24

标签: sql oracle

所以我有一个带有一堆成员信息(700万条记录)的数据库,我可以从中提取信息。然后在一个单独的系统中,我有一个800K emials的列表。我想要做的是将数据库中的所有成员与此800K电子邮件列表进行匹配。我没有能力使用这些电子邮件在数据库中创建一个表 - 我只能从数据库中读取。

所以我的问题是,最好的方法是什么?我是否可以编写一个sql语句,从csv文件中读取这些800k到内存中,然后执行查找与此列表进行比较?方法是什么?我只想为那些信息在该外部列表中的成员提取所有emmebr信息...

由于

2 个答案:

答案 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语句通常是一个坏主意,但对于一次性过程来说这很好。