1

我想在两个表(A和B)之间加入,我想插入不在表B中且不在交叉点上的行(就像我在图片上展示的那样),将它们插入到表B中。

如果我在 sql 上,我可以这样做:

SELECT *
FROM A
LEFT JOIN B ON A.key = B.key
WHERE B.key IS NULL

但在 ODI 上。我做不到。我刚刚完成了左外连接,但它并没有解决我的问题,通过左外连接,我可以获取表 A 上的所有行以及 A 和 B 交叉点上的行。

我需要的只是提取表 A 上的所有行,而没有交叉点上的行。如何在 ODI 上解决此问题

非常感谢你的帮助。

4

4 回答 4

2

这应该有效:

  1. 您可以在 ODI 接口中为 A.key = B.key 创建内部联接
  2. 编辑此内部联接并将联接条件替换为 A.key (+) = B.key
  3. 保存界面
  4. 在界面中创建一个过滤器WHERE B.key IS NULL
于 2017-08-29T09:22:42.780 回答
0
select col1,col2.... from A 
minus 
select col1,col2.... from B

或者如果 A 和 B 具有不同的结构,那么

 select * from A 
 where A.key not in (select distinct(key) from B)
于 2015-09-14T10:12:22.753 回答
0

如果您使用的是 ODI 11g,则可以在黄色(临时)界面中进行连接,他们在蓝色界面中重用该界面,您可以在其中应用过滤器。确保在蓝色界面的源上选择“用作派生语句(子选择)”。通过这样做,黄色界面将是一个子查询,并且您确定在加入后应用了过滤器。

如果您使用的是 ODI 12c,则可以在数据集组件中进行连接并在数据集的输出上添加过滤器。因此,您确定在加入后应用了过滤器。

于 2015-09-14T11:59:49.163 回答
0

您应该能够让 ODI 生成您提供的 SQL,而无需求助于基于集合的操作 (MINUS),这也应该表现得更好。

您能否确保拆分映射中的逻辑并将A.key = B.key条件放入 JOIN 和单独的FILTER中B.key IS NULL

于 2015-09-15T10:35:12.573 回答