【发布时间】:2017-03-06 07:35:30
【问题描述】:
我有一个包含两列的表格:
OLD_REVISIONS |NEW_REVISIONS
-----------------------------------
1,25,26,24 |1,26,24,25
1,56,55,54 |1,55,54
1 |1
1,2 |1
1,96,95,94 |1,96,94,95
1 |1
1 |1
1 |1
1 |1
1,2 |1,2
1 |1
1 |1
1 |1
1 |1
-
对于每一行,都会有一个文档的修订列表(逗号分隔)
-
逗号分隔的列表在两列中可能相同,但顺序/排序可能不同 - 例如
2,1 |1,2
我想找出 OLD_REVISIONS 列中的最高版本低于 NEW_REVISIONS 中的最高版本的所有实例
以下内容符合该标准
OLD_REVISIONS |NEW_REVISIONS
-----------------------------------
1,2 |1
1,56,55,54 |1,55,54
-
我尝试了使用 MINUS 选项的解决方案(将表连接到自身),但即使列表相同但顺序错误,它也会返回差异
-
我尝试了函数 GREATEST(即
greatest(new_Revisions) < greatest(old_revisions)),但我不确定为什么最大(OLD_REVISIONS)总是只返回逗号分隔值。它不返回最大值。我怀疑它正在比较字符串,因为列是 VARCHAR。
另外,MAX 函数需要一个数字。
还有其他方法可以实现上述目标吗?我正在寻找一个纯 SQL 选项,以便我可以打印出结果(或可以打印出结果的 PL/SQL 选项)
编辑
很抱歉没有提及这一点,但对于 NEW_REVISIONS,我确实将数据放在一个表中,其中每个修订版都位于单独的行中:
"DOCNUMBER" "REVISIONNUMBER"
67 1
67 24
67 25
67 26
75 1
75 54
75 55
75 56
78 1
79 1
79 2
83 1
83 96
83 94
只是为了提供一些内容,几周前我怀疑有修订消失了。 为了对此进行调查,我决定对所有文档的所有修订进行计数,并拍摄快照以便稍后进行比较,以查看是否确实缺少修订。
我拍摄的快照包含以下列:
docnumber, count, revisions
使用 listagg 函数将修订存储在逗号分隔的列表中。
我现在遇到的问题是实时表,已经添加了新的修订,所以当我使用减号比较主表和快照时,我得到了不同,因为 主表中的新修订。
尽管在实际表中修订是单独的行,但在快照表中我没有单独的行。
我正在考虑以相同格式重新创建快照并比较它们的唯一方法,以了解主表中的最大修订是否低于快照表中的最大修订(因此为什么我试图找出如何找到以逗号分隔的字符串中的最大值)
【问题讨论】:
-
这是表示这些值的错误方式。每个修订版应该有一行,而不是将一堆修订版塞进一个字符串中。
-
如果正确规范化数据模型,查询将非常简单
-
将此表拆分为两个表(旧表和新表),您还应该将逗号分隔的值拆分为行。之后就很简单了。
-
你尝试的一切都失败了,原因很简单——你目前在表中的是字符串;它们是用逗号分隔的数字这一事实无关紧要。您所做的任何比较(包括与
max()或greatest())只会将它们作为字符串进行比较。您需要将字符串分解为其组件编号。 -
在您修改后,我已经修改了我的答案。
标签: sql oracle plsql oracle10g aggregate-functions