Расширенный противоположный листаг - PullRequest
0 голосов
/ 21 марта 2019

Я заметил некоторый вопрос, касающийся того, как «отсоединить», но пока я не смог найти что-то, отвечающее моим требованиям ниже.Извините, если я пропустил какой-то хороший ответ в прошлом.

У меня есть данные, как показано ниже:

------------------------------------------------------------
| Title   | column_A     | column_B        | column_c        |
--------------------------------------------------------------
| 3007576 | 1000         | 0               | 3000             |
| 3007879 | 100,200,300  |                 | 400,500         |
--------------------------------------------------------------

, но я хотел бы отобразить их в:

------------------------------------------------------------
| Title   | column_A     | column_B        | column_c        |
--------------------------------------------------------------
| 3007576 | 1000         | 0               | 3000            |
| 3007879 | 100          |                 | 400             |
| 3007879 | 100          |                 | 500             |
| 3007879 | 200          |                 | 400             |
| 3007879 | 200          |                 | 500             |
| 3007879 | 300          |                 | 400             |
| 3007879 | 300          |                 | 500             |
--------------------------------------------------------------

1 Ответ

0 голосов
/ 21 марта 2019

Проблема с вашими данными состоит в том, что есть три столбца, и они могут быть обнуляемыми или иметь разную длину.Таким образом, вы можете сначала выполнить три подзапроса (где важно левое соединение, чтобы не потерять ни одной строки), а затем снова данные о левом соединении.Чтобы разделить строки, я использовал xmltable способ, вы можете использовать любой другой метод, уже описанный в SO.

-- sample data
with t(title, column_A, column_B, column_c) as (
    select 3007576, '1000', '0', '3000' from dual union all
    select 3007879, '100, 200,300', null, '400,500' from dual union all
    select 3007900, null, '80, 205, 212', '54, 5417' from dual )
-- end of sample data
select *
  from (
    select title, trim(column_value) ca from t 
      left join xmltable(('"' || replace(column_a, ',', '","') || '"')) on 1 = 1) a
  left join (
    select title, trim(column_value) cb from t 
      left join xmltable(('"' || replace(column_b, ',', '","') || '"')) on 1 = 1) b 
  using (title)
  left join (
    select title, trim(column_value) cc from t 
      left join xmltable(('"' || replace(column_c, ',', '","') || '"')) on 1 = 1) c 
  using (title)
  order by title, ca, cb, cc

Результат для моих данных:

TITLE    CA    CB    CC
-------- ----- ----- -----
 3007576 1000  0     3000
 3007879 100         400
 3007879 100         500
 3007879 200         400
 3007879 200         500
 3007879 300         400
 3007879 300         500
 3007900       205   54
 3007900       205   5417
 3007900       212   54
 3007900       212   5417
 3007900       80    54
 3007900       80    5417
...