如何使用完整缓存模式从查找中获取所有匹配行?

问题描述 投票:0回答:2

我需要在 C 列上的两个表 T1(A,B,C) 和 T2(A,B,C,D,E) 之间进行查找,以获取所有匹配的 B 列值:

T1:

enter image description here

T2:

enter image description here

当我选择完全缓存模式时,我仅获得第一个匹配行(我只对 B 列值感兴趣):12122,但我还需要获得 12123 和 12124,因为 C 也与这些行匹配。

我尝试通过使用带有

inner join
的自定义查询(在 SSMS 中执行查询时返回所有需要的行)来使用部分和无缓存模式,但不会返回所有行,这会降低性能。

我也尝试过这里提出的解决方案:

如何在SSIS数据流中获取两个源之间不匹配的数据?

它给出的结果与查找相同,而且我需要将不匹配的行重定向到新表。

sql-server ssis ssis-2012
2个回答
1
投票

我认为缓存模式不会影响你的结果,它是基于性能的。最终的解释是:

•如果参考表中有多个匹配项,则查找 转换仅返回查找返回的第一个匹配项 询问。如果找到多个匹配项,则进行查找转换 仅当转换完成时才会生成错误或警告 配置为将所有参考数据集加载到缓存中。在这个 在这种情况下,查找转换会在以下情况下生成警告: 转换在转换填充时检测多个匹配项 缓存。

要从T2获取匹配的

B
,只需使用OLE DB源中的SQL(命令)即可,例如:

SELECT distinct T2.B 
FROM T1 as A 
INNER JOIN T2 as B
ON B.C = A.C

-1
投票

如果 LONG 的答案不能满足您的需求,您需要编写一个脚本转换,以异步模式操作(1 行输入可以产生 0 到许多输出行)

如果源数据/T1 不包含重复的 C 值,则组件的预执行阶段可以将 T2 中 B 列和 C 列的结果缓存到本地内存中。然后,对于流经的每个源行,您需要循环遍历结果并将 B 值附加到数据流中。

如果 T1 可能有重复的数据,这会变得更加棘手,因为您需要查询流经的每一行的目标表 - 但您还必须跟踪已经滚动的 B/C 值可能还需要引用那些 B。

您还可以评估合并连接,因为我认为允许发出多行,但我猜您可以通过脚本转换更好地控制性能。

无论哪种方式,当您拉入 T2 表时,编写自定义查询并仅选择您需要的列(B&C)。

© www.soinside.com 2019 - 2024. All rights reserved.