从两个表中获取缺少的行而不匹配索引

时间:2015-11-04 12:35:07

标签: sql oracle

我试图找出正确的sql但没有任何运气。 我有两张桌子:

TBL1
    code         varchar  pk
    parent_code  varchar
    row          integer  pk
    parent_row   integer
    desc         varchar
    order_number integer  pk
    version      integer

TBL2
    code         varchar  pk
    parent_code  varchar
    row          integer  pk
    parent_row   integer
    desc         varchar
    order_number integer  pk
    version      integer  pk

TBL1是主表。 每次发生变化时,版本都会增加1。 在TBL2上我保存了所有版本,以便我可以捕获更改。 我无法触摸TBL1,因为数据来自外部,但我可以在TBL2上更改我想要的任何内容。 我想获得在当前版本(TBL1)上添加但在前一版本(TBL2上)中缺少的行。 问题是row和parent_row可能很容易成为pk,因为它们是渐进式的,可以在不同版本之间进行更改,因此我可能会遇到以下情况:

TBL1
AA01   AA00   2    1    example 2  110    5
AA02   AA00   3    1    example 3  110    5
AA03   AA00   4    1    example 4  110    5
AA04   AA01   5    2    example 5  110    5

TBL2
AA01   AA00   2    1    example 2  110    4
AA02   AA00   3    1    example 3  110    4
AA04   AA01   4    2    example 5  110    4
AA01   AA00   2    1    example 2  110    3
AA02   AA00   3    1    example 3  110    3
AA04   AA01   4    2    example 5  110    3

如果我进行比较,我想知道在最后一个版本中添加了代码AA03 与前一个。 我尝试使用LEFT JOIN,但是如果在TBL1和TBL2之间进行比较,第4列引用了两篇不同的文章,所以我不能在连接查询中使用它。

SELECT
    A.CODE,
    A.PARENT_CODE,
    A.ROW,
    A.PARENT_ROW,
    B.CODE
FROM TBL1 A
    LEFT JOIN TBL2 B ON A.CODE = B.CODE AND A.PARENT_CODE = B.PARENT_CODE
WHERE A.ORDER = 110
    AND (B.VERSION = 4 OR B.VERSION IS NULL)

但是使用这个sql我没有在B.CODE列上获得null

问题在于我可能有多个代码(它们不是唯一的),即使在相同的父代码下也是如此。

有没有办法找到lates verion中添加的行, 比如在这个例子中TBL1的第4行代码是AA03吗? 我正在使用ORACLE 11

谢谢

1 个答案:

答案 0 :(得分:1)

如果您要查找的是TBL1中出现的代码而不是TBL2中的代码(如CODE列中的值所示) - 加入不是正确的选择。 您应该在两个表之间执行减号,结果将是TBL2中不存在的代码列表,如下所示 -

[[1]]