【问题标题】:Using Recursive CTE on ORACLE to create a multicolumn filtering在 ORACLE 上使用递归 CTE 创建多列过滤
【发布时间】:2014-03-31 17:18:27
【问题描述】:

我目前正在使用 VBA 函数循环遍历 Oracle 结果集,以消除多个列/字段上的重复项(即每列中只有不同的值)例如:

我的结果集按 RECORD_ID 排序,我想消除 FIELD_1 和 FIELD_2 的重复:

RECORD_ID   FIELD_1     FIELD_D
1           A           i
2           A           j
3           B           i
4           B           k
5           C           j
6           C           k
7           D           k

所以我的程序创建了一个新表(比如 FINAL_TABLE)并评估原始 sql 结果集中的每一行(比如 TABLE_1):

IF TALBE_1.FIELD_1 的当前值 IS NOT 在 FINAL_TABLE.FIELD_1 AND TALBE_1.FIELD_2 的当前值 IS NOT in FINAL_TABLE.FIELD_2 THEN 将记录/行插入 FINAL_TABLE

这会导致

Column 1    Column 2    Column 3
1           A           i
4           B           k
5           C           j

第 2 列和第 3 列只有唯一值。

我尝试过使用 LAG 和 PATTERN MATCHING 函数寻找一种从循环转移到 SQL 的方法,但无法弄清楚。 (想不出使用 distinct 的方法)

我还研究了创建可能组合表然后从中进行选择的方法,但这是不可行的,因为只有几千行数据会使组合数量太大,大多数计算机无法处理。

底线:这个逻辑可以通过递归 SQL 查询来实现吗?

【问题讨论】:

  • 我认为您必须使用递归 CTE 来实现此逻辑。你用的是 11g 吗?
  • 是的,我使用的是 11g。从来没有处理过CTE,打算读一读。有什么建议吗?
  • 如果我正确理解问题,此处理需要顺序传递数据。您不妨留下足够好的东西并将代码保留在 VB 中。虽然可以在数据库中完成,但是会失去一些数据库处理的优势。
  • 我的问题确实是我从 SQL 查询中得到的数据大约有 400 万条记录,因此在 VB 中执行起来很困难,而且在最终用户 PC 上运行时肯定也很耗时。出于两个原因(容量和时间),我想将此处理抵消给服务器。所以这是一个死胡同吗?

标签: sql oracle vba


【解决方案1】:

如果您将结果集存储在临时表中,那么我认为您可以使用delete

delete from temp
    where exists (select 1
                  from temp t2
                  where t2.id < temp.id and (t2.col2 = temp.col2 or t2.col3 = temp.col3)
                 );

【讨论】:

  • 噢!让我试试,听起来简单而高效:D
  • 我还在思考为什么delete 看起来这么容易表达,但我想不出另一种方法。这可能是一类有趣的问题的例子。
  • 您要比较的 t 是什么? t 未定义。
  • @user3460414 。 . .那应该只是原始表。我不确定这是否会真正起作用。也许它会解决你的问题。这是一个非常微妙的问题。
  • 该解决方案不起作用,因为它会查看结果集中的所有行。我正在查看递归 WITH,但也无法弄清楚!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
相关资源
最近更新 更多