我需要在 C 列上的两个表 T1(A,B,C) 和 T2(A,B,C,D,E) 之间进行查找,以获取所有匹配的 B 列值:
T1:
T2:
当我选择完全缓存模式时,我仅获得第一个匹配行(我只对 B 列值感兴趣):12122,但我还需要获得 12123 和 12124,因为 C 也与这些行匹配。
我尝试通过使用带有
inner join
的自定义查询(在 SSMS 中执行查询时返回所有需要的行)来使用部分和无缓存模式,但不会返回所有行,这会降低性能。
我也尝试过这里提出的解决方案:
它给出的结果与查找相同,而且我需要将不匹配的行重定向到新表。
我认为缓存模式不会影响你的结果,它是基于性能的。最终的解释是:
•如果参考表中有多个匹配项,则查找 转换仅返回查找返回的第一个匹配项 询问。如果找到多个匹配项,则进行查找转换 仅当转换完成时才会生成错误或警告 配置为将所有参考数据集加载到缓存中。在这个 在这种情况下,查找转换会在以下情况下生成警告: 转换在转换填充时检测多个匹配项 缓存。
要从T2获取匹配的
B
,只需使用OLE DB源中的SQL(命令)即可,例如:
SELECT distinct T2.B
FROM T1 as A
INNER JOIN T2 as B
ON B.C = A.C
如果 LONG 的答案不能满足您的需求,您需要编写一个脚本转换,以异步模式操作(1 行输入可以产生 0 到许多输出行)
如果源数据/T1 不包含重复的 C 值,则组件的预执行阶段可以将 T2 中 B 列和 C 列的结果缓存到本地内存中。然后,对于流经的每个源行,您需要循环遍历结果并将 B 值附加到数据流中。
如果 T1 可能有重复的数据,这会变得更加棘手,因为您需要查询流经的每一行的目标表 - 但您还必须跟踪已经滚动的 B/C 值可能还需要引用那些 B。
您还可以评估合并连接,因为我认为允许发出多行,但我猜您可以通过脚本转换更好地控制性能。
无论哪种方式,当您拉入 T2 表时,编写自定义查询并仅选择您需要的列(B&C)。