【问题标题】:Oracle SQL in string matches and table joins字符串匹配和表连接中的 Oracle SQL
【发布时间】:2019-04-19 17:05:58
【问题描述】:

我需要一些关于如何解决这个问题的指导。

考虑以下 3 个表格:

我在 Oracle 中继承了这个数据集。我需要找到一种方法将这 3 个表合并为一个表。为什么?合规和欺诈检查。我们正在接受审计,我别无选择,只能遵守。

这些表有数百万条记录。 6900万。七百万,四百万。如果我尝试使用 contains、instr 或 like 来连接和搜索,我会创建笛卡尔连接(我认为),它会很慢。

我该如何处理?数据用方括号格式化,如图所示。我曾考虑将这些表拉入 pandas 并使用 python 来得到答案。

生成的表格如下所示:

【问题讨论】:

  • 生成的表格应该是什么样子? Concat_identifier_plate的格式是什么?
  • concat_identifier_plate的格式可以是一个人或一个团队的标识符号,也可以是2个人,一条鱼。在某些地方确实令人费解。
  • 嗯,我认为这无论如何都会很慢,一个人有多个用餐和团队,这可能会导致组合数量不可预测地增加。顺便问一下,为什么样本结果中出现了重复的“George”记录?
  • 因为 George 和 Jenny 都出现在同一个团队字符串中。老实说,这是一个混乱的问题。我正在考虑首先按表格解构数据,然后再次缝合。可能没有一个简单的答案。
  • 这可能是个好主意。我也将从将连接的字符串拆分为数字 id 开始。这应该是相对微不足道的(例如select to_number(regexp_substr(concat_identifier_partner, '[0-9]+', 1, 1)) as first_person_id from teams)

标签: python oracle pandas plsql


【解决方案1】:

我认为您的第一步应该是以可用的格式获取膳食和团队表。使用这些奇怪的连接列永远不会容易或快速。

做一些简单的事情,比如 this 将 id 拆分到不同的行:

select trim(column_value) partner_id,
       team
  from teams,
       xmltable(('"' || replace(teams.concat_identifier_partner, ']',']","') || '"'))

给出这样的输出:

+------------+------+
| PARTNER_ID | TEAM |
+------------+------+
| [012345]   | Blue |
| [012346]   | Blue |
| [012347]   | Red  |
+------------+------+

然后您可以将它们用作查询中的内联视图,或者为其中的每一个创建一个新的临时表。临时表将允许您在新的 ID 列上对它们进行索引。

在您的数据采用更简单的格式后,连接变得容易。

select people.identifier,
       people.name,
       formatted_teams.team,
       formatted_meals.meal
from people
join (select trim(column_value) partner_id,
              team
       from teams,
       xmltable(('"' || replace(teams.concat_identifier_partner, ']',']","') || '"')) ) formatted_teams
  on people.identifier = formatted_teams.partner_id
left join (select trim(column_value) plate_id,
            meal
       from meals,
       xmltable(('"' || replace(meals.concat_identifier_plate, ']',']","') || '"')) ) formatted_meals
  on people.identifier = formatted_meals.plate_id
order by people.identifier

输出:

+------------+--------+------+--------+
| IDENTIFIER |  NAME  | TEAM |  MEAL  |
+------------+--------+------+--------+
| [012345]   | George | Blue | Salmon |
| [012346]   | Jenny  | Blue |        |
| [012347]   | Alex   | Red  | Pike   |
| [012347]   | Alex   | Red  | Cod    |
+------------+--------+------+--------+

【讨论】:

    猜你喜欢
    • 2015-10-11
    • 2015-10-30
    • 2011-07-27
    • 2010-11-25
    • 2018-03-23
    • 2014-03-29
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    相关资源
    最近更新 更多