Как использовать запрос выбора внутри имени столбца выбора, перебирая значения строки столбца с помощью оракула? - PullRequest
0 голосов
/ 27 мая 2019

Запрос:

select column_one, column_two, column_three 
from main_tbl_name

Выход:

column_one  column_two
--------------------------------------------------------------------------------
data1       SBANAR SBARTO SCBADP SCCHBA SCHPIT SCTHAB SDPCLV SDPRPN SDPSEC SERIE
data2       SRALEN SRETIN SRUNLI SSAPEL SSATAR SSCMAR SSDECA
data3       DRAP14 E05A E1 ECOMOD ENJO01 ENPC01 ESPHSA ESS

У меня есть другой запрос:

select column_one, column_two, column_three 
from another_tbl_name 
where column_four in (main_tbl_name.column_two)

Мне нужно разделить значения main_tbl_name.column_two на, например, такие как ('SBANAR', 'SBARTO', 'SCBADP', 'SCCHBA', 'SCHPIT', 'SCTHAB', 'SDPCLV', 'SDPRPN' , 'SDPSEC', 'SERIE')

В приведенном выше втором запросе, если существуют некоторые значения, добавьте каждое повторяющееся значение в main_tbl_name.column_three

Так что мой окончательный результат должен быть

column_one  column_two                                                                  column_three
-------------------------------------------------------------------------------------------------------------------------
data1       SBANAR SBARTO SCBADP SCCHBA SCHPIT SCTHAB SDPCLV SDPRPN SDPSEC SERIE        SBANAR SBARTO SCCHBA SDPCLV SDPSEC
data2       SRALEN SRETIN SRUNLI SSAPEL SSATAR SSCMAR SSDECA                            SRALEN SSCMAR SSDECA
data3       DRAP14 E05A E1 ECOMOD ENJO01 ENPC01 ESPHSA ESS                              DRAP14 E05A ESPHSA ESS

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

Итак, вы хотите:

  • Преобразовать main_tbl_name.column_two в строки
  • Для каждой из этих сгенерированных строк, ссылку на одну из существующих строк таблицы?

Если это так, вы можете сделать что-то, как показано ниже:

WITH DATA AS
     ( SELECT 44 AS COLUMN_ONE  ,'WORD1 WORD2 WORD3 <!-- language: lang-sql --> WORD4 WORD5 WORD6' COLUMN_TWO FROM DUAL     )
SELECT COLUMN_ONE  ,TRIM(REGEXP_SUBSTR(COLUMN_TWO, <!-- language: lang-sql --> '[^ ]+', 1, LEVEL)) COLUMN_TWO
FROM DATA
CONNECT BY INSTR(COLUMN_TWO, ' ', 1, LEVEL - 1) > 0;

COLUMN_ONE  COLUMN_TWO
44          WORD1
44          WORD2
44          WORD3
44          WORD4
44          WORD5
44          WORD6

Ура !!!Dhilen

0 голосов
/ 27 мая 2019

Вот пример с данными, похожими на ваши:

with 

-- sample data
  main_tbl_name ( column_one,  column_two) as (
    select 'data1', 'SBANAR SBARTO SCBADP SCCHBA SCHPIT SCTHAB SDPCLV SDPRPN SDPSEC SERIE' 
      from dual union all
    select 'data2', 'SRALEN SRETIN SRUNLI SSAPEL SSATAR SSCMAR SSDECA' 
      from dual union all
    select 'data3', 'DRAP14 E05A E1 ECOMOD ENJO01 ENPC01 ESPHSA ESS' from dual ),
  another_tbl_name(column_four) as (
    select 'SDPSEC SBANAR SBARTO SCCHBA SDPCLV' from dual union all
    select 'DRAP14 E05A ESPHSA ESS' from dual), 
  -- end of sample data

  t1 as (select column_one c1, column_two c2, '"'||replace(column_two, ' ', '", "')||'"' cx 
           from main_tbl_name),
  t2 as (select '"'||replace(column_four, ' ', '", "')||'"' cx 
           from another_tbl_name)
select c1, c2, listagg(b.cs, ' ') within group (order by b.cs) c3
  from (select c1, c2, trim(column_value) cs from t1, xmltable(cx)) a
  left join (select trim(column_value) cs from t2, xmltable(cx)) b on a.cs = b.cs
  group by c1, c2 

... что приводит:

C1    C2                                                                   C3
----- -------------------------------------------------------------------- -------------------------------
data1 SBANAR SBARTO SCBADP SCCHBA SCHPIT SCTHAB SDPCLV SDPRPN SDPSEC SERIE SBANAR SBARTO SCCHBA SDPCLV SDPSEC
data2 SRALEN SRETIN SRUNLI SSAPEL SSATAR SSCMAR SSDECA
data3 DRAP14 E05A E1 ECOMOD ENJO01 ENPC01 ESPHSA ESS                       DRAP14 E05A ESPHSA ESS

демо

Это решение основано на xmltable, левом соединении и listagg(). Я предположил, что один пробел является разделителем. Если another_table содержит данные не в виде списка, вы можете даже упростить этот запрос.

В основном вам нужно разделить список столбцов, а затем соединить. Есть и другие способы сделать это, например, иерархические запросы, функции PLSQL, уже размещенные в SO. Используйте любой метод, который вам подходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...