【发布时间】:2015-09-09 19:17:15
【问题描述】:
以前,我曾为我必须面对的情况寻求一种可能的解决方案,以便实现 sql 查询(最初是在 access 中实现的)。我已经找到了一个解决方案(在询问了很多之后),但我想知道是否有人有其他方式来执行这个查询。
我有两个不同的表,一个在 sql 中,另一个在 oracle(S 和 O)中
O(A, B, C) => PK=(A,B) 和 S(D,E,F) => PK = (D,E)
查询如下所示
SELECT A,B,C,E,F
FROM S INNER JOIN O ON
S.D = O.A (Only one attribute of the PK in O)
S 有超过 10.000 个寄存器,O 有超过 7 亿个。鉴于此,实现合并连接或查找不是逻辑,因为我将只有 D 和 A 之间的第一个匹配项。 所以我认为在Oracle端组装查询会更好。为此,我实施了这样的方案。
使用 sql 我已经执行了这个查询:
with tmp(A) as ( select distinct D as A from S
)
select cast( select concat(' or A = ', A)
from tmp
for xml path('')) as nvarchar(max)) as ID
我得到一个字符串,其中包含我要在 oracle 上搜索的值。 最后在数据流中,我创建了一个这样的表达式:
select A, B, C
from O
where A= '' + @ID
我将这些值下载到 sql server,然后我可以随意操作它们。
foreach 循环的使用是必要的,因为我将 sql 字符串存储在对象变量中。我发现 SSIS 在 nvarchar(max) 变量方面存在一些问题。
一些注意事项:
1) Oracle 数据库由公司的另一个部门管理,他们只授予对表的读取权限。
2) sql server的DBA不允许下载暂存区的O表。没有与他谈判的可能性,此外,这个表每天都会更新更多的寄存器。他只管理这台服务器,对 Oracle 没有任何权限。
3) 为我团队的一些成员提供的解决方案是在 oracle 中在不同表之间创建一个查询,该查询可以为我提供我需要的 O 属性,结果我可以获得超过 300 万个寄存器并不是所有的属性 A 都出现在 S 中。而且,D 的一些值已经被操纵,所以它们可能不会出现在 O 中。
通过这个实现,我从 Oracle 获得了超过 150.000 个寄存器。但我想知道是否可以实施另一种解决方案,或者是否可以使用其他组件来达到相同的结果。相信我,我之前已经阅读、询问和搜索了很多内容来实施此流程。
【问题讨论】:
标签: sql-server oracle join ssis