我试图找出正确的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
谢谢
答案 0 :(得分:1)
如果您要查找的是TBL1中出现的代码而不是TBL2中的代码(如CODE列中的值所示) - 加入不是正确的选择。 您应该在两个表之间执行减号,结果将是TBL2中不存在的代码列表,如下所示 -
[[1]]