Oracle SQL в строковых совпадениях и объединениях таблиц - PullRequest
0 голосов
/ 16 ноября 2018

Мне нужно несколько советов о том, как подойти к этой проблеме.

Рассмотрим следующие 3 таблицы: enter image description here

Я унаследовал этот набор данных в Oracle. Мне нужно найти способ объединить эти 3 таблицы в одну таблицу. Зачем? Проверка на соответствие и мошенничество. Нас проверяют, у меня нет выбора, кроме как подчиниться.

Таблицы представляют собой миллионы записей. 69million. 7 миллионов, 4 миллиона. Если я попытаюсь присоединиться и выполнить поиск с использованием содержимого, или instr или т.п., я буду создавать декартовы объединения (я думаю), и это будет довольно медленно.

Как мне подойти к этому? Данные отформатированы в квадратных скобках, как на рисунке. Я подумал о том, чтобы перенести эти таблицы в панды и использовать python, чтобы получить ответ.

Получившаяся таблица будет выглядеть так: enter image description here

1 Ответ

0 голосов
/ 16 ноября 2018

Я думаю, что вашим первым шагом будет получение столов с питанием и командами в удобном для вас формате.Использование этих странных конкатенационных столбцов никогда не будет легким или быстрым.

Делать что-то простое, например this , чтобы разделить идентификаторы на разные строки:

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

Дает вывод, подобный следующему:

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

Затем вы можете использовать их как встроенные представления в вашем запросе или создать новую временную таблицу для каждого из них.Временная таблица позволит вам проиндексировать их в новом столбце идентификатора.

После того как ваши данные будут в более простом формате, объединения станут проще.

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    |
+------------+--------+------+--------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...