Сложный SQL, включающий LOOP и QUERY - PullRequest
0 голосов
/ 04 января 2019

У меня есть результат некоторого запроса, который имеет только один столбец, и в этом столбце мне нужно проходить строку за строкой, делая запрос содержимого этой строки, и где в конце мне нужна таблица со всеми результатами этих запросов, которые я сделал строка за строкой

Я использую SQL Developer с подключением к БД Oracle

это воспроизводит мой первый выбор

SELECT DISTINCT REGEXP_SUBSTR ('5256,5257,5258,5259','[^,]+',1,LEVEL) NUM_PROD
FROM dual CONNECT BY REGEXP_SUBSTR ('5256,5257,5258,5259','[^,]+',1,LEVEL) IS NOT NULL

Мне нужно получить, например, этот контент 5256 и использовать в другом запросе.

Это вернет результат, подобный этому:

NAME      | NUM_PROD | COLUMN1 | COLUMN2

Michael | 5256 | AA | BB

после того, как результат всего этого запроса должен быть похож на

Michael | 5256 | AA | BB

Rachel  | 5257| AA | BB

Jony      | 5258| AA | CC

Спасибо за помощь.

EDIT:

Позвольте мне лучше объяснить, как работает моя структура

create table tableA (cod_person, nam_person, num_atend, num_presc, columnX, ColumnY) as (
    select 100, 'Michael', 3300, 2215, 'XX', 'YY' from dual union all
    select 101, 'Rachel',  3301, 2351, 'XX', 'YY' from dual union all
    select 103, 'Jony',    3302, 2463, 'XX', 'YY' from dual union all
    select 104, 'Tony',    3303, 2235, 'XX', 'YY' from dual);


create table tableB (num_presc, num_seq, columnXX, ColumnYY) as (
    select 2215, 2332,'XX', 'YY' from dual union all
    select 2351, 2334,'XX', 'YY' from dual union all
    select 1531, 2345,'XX', 'YY' from dual union all
    select 3250, 2348,'XX', 'YY' from dual);


create table tableC (num_presc, num_prod, num_seq_mat, columnXXX, ColumnYYY) as (
    select 2215, 5256, 2332,'XX', 'YY' from dual union all
    select 1205, 5252, 2337,'XX', 'YY' from dual union all
    select 2351, 5258, 2334,'XX', 'YY' from dual union all
    select 3135, 5260, 2349,'XX', 'YY' from dual);

Мой запрос должен быть похож на

SELECT
    aa.cod_person,
    aa.nam_person,
    aa.num_atend,
    num_prod
FROM (SELECT DISTINCT regexp_substr ('5256,5257,5258,5259','[^,]+',1,level) num_prod FROM dual CONNECT BY regexp_substr ('5256,5257,5258,5259','[^,]+',1,level) IS NOT NULL)
    left join aa using (tableA)
    left join bb using (tableB)
    left join cc using (tableC)
WHERE   bb.num_presc = cc.num_presc 
AND     bb.num_seq = cc.num_seq_mat
AND     cc.num_prod =  (HERE WHEN I AM QUERYING ONE BY ONE I PUT THE NUM_PROD BUT NOW I'M SEARCHING ALL IN ONE TIME, SO, I DONT KNOW IF NEEDED THIS ARGUMENT)
AND     aa.num_presc = bb.num_presc
group by aa.cod_person, aa.num_atend

В настоящее время я делаю этот запрос один за другим и работаю с этим кодом:

SELECT
    aa.cod_person,
    aa.nam_person,
    aa.num_atend,
    5256 num_prod
FROM    tableA aa,
        tableB bb,
        tableC cc
WHERE   bb.num_presc = cc.num_presc 
AND     bb.num_seq = cc.num_seq_mat
AND     cc.num_prod =  5256
AND     aa.num_presc = bb.num_presc
group by aa.cod_person, aa.num_atend

но мне нужны все результаты вместе

1 Ответ

0 голосов
/ 04 января 2019

Тебе здесь не нужны петли. Просто объедините (или оставьте соединение) ваш запрос с другими данными, это может быть таблица (ы) или другой запрос:

select n.num_prod, o.name, o.column1, o.column2
  from (your_complex_query) n
  join (some_other_query) o on o.some_id = n.num_prod

Например, допустим, у нас есть две другие таблицы:

create table emp (num_prod, name, dept_no) as (
    select 5256, 'Michael', 'SL' from dual union all
    select 5257, 'Rachel',  'SL' from dual union all
    select 5258, 'Jony',    'IT' from dual union all
    select 5600, 'Tony',    'AC' from dual);

create table dep (dept_no, description) as (
    select 'AC', 'Accounting'    from dual union all
    select 'SL', 'Sales'         from dual union all
    select 'IT', 'IT Department' from dual);

Таким образом, наш запрос будет:

select num_prod, emp.name, dept_no, dep.description
  from (
    select distinct regexp_substr ('5256,5257,5258,5259','[^,]+',1,level) num_prod
      from dual 
      connect by regexp_substr ('5256,5257,5258,5259','[^,]+',1,level) is not null)
  left join emp using (num_prod)
  left join dep using (dept_no);

или

select n.num_prod, d.name, d.dept_no, d.description
  from (
    select distinct regexp_substr ('5256,5257,5258,5259','[^,]+',1,level) num_prod
      from dual 
      connect by regexp_substr ('5256,5257,5258,5259','[^,]+',1,level) is not null) n
  left join (select * from emp join dep using (dept_no)) d on d.num_prod = n.num_prod;

Результат:

NUM_PROD  NAME    DEPT_NO DESCRIPTION
--------- ------- ------- -------------
5257      Rachel  SL      Sales
5256      Michael SL      Sales
5258      Jony    IT      IT Department
5259 

Edit:

Я создал образцы таблиц, как вы сделали это в отредактированном вопросе. Точный запрос, который вам нужен:

select distinct aa.cod_person, aa.nam_person, aa.num_atend, nps.num_prod
from (select distinct regexp_substr ('5256,5257,5258,5259','[^,]+',1,level) num_prod 
        from dual 
        connect by regexp_substr ('5256,5257,5258,5259','[^,]+',1,level) IS NOT NULL) nps
    left join tablec cc on cc.num_prod = nps.num_prod
    left join tableb bb on bb.num_presc = cc.num_presc and bb.num_seq = cc.num_seq_mat 
    left join tablea aa on aa.num_presc = bb.num_presc

Соединяйте таблицы в правильном порядке, создавайте правильные условия соединения и используйте псевдоним для вашего генератора num_prod, я использовал nps в своем запросе. Результат:

COD_PERSON NAM_PERSON  NUM_ATEND NUM_PROD
---------- ---------- ---------- -------------------
                                 5259
       100 Michael          3300 5256
       101 Rachel           3301 5258
                                 5257
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...