Oracle передает два параметра в нескольких строках подзапросу (или из запроса к другому) - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь передать два параметра из первого запроса во второй запрос:

SELECT t1.FAM,t2.CODE FROM (SELECT t1.FAM, t2.CODE FROM (SELECT num_family FROM family) t1, (SELECT num_code FROM code) t2)

Итак, у меня есть два параметра (несколько строк):

FAM1 | CODE1
FAM1 | CODE2
FAM1 | CODE3
FAM2 | CODE1
FAM2 | CODE2
FAM2 | CODE3

Итак, это мои два параметра, и я хочу поместить эти два параметра в третий запрос:

SELECT count(*) FROM stats WHERE num_fam LIKE '%FAM1%' AND num_code LIKE '%FAM1%';

Иметь:

FAM1 | CODE1 | 5
FAM1 | CODE2 | 2
FAM1 | CODE3 | 0
FAM2 | CODE1 | 9
FAM2 | CODE2 | 4
FAM2 | CODE3 | 1

Но я не понимаю, как объединить эти два запроса и передать два параметра из первого запроса во второй: я пробовал с подзапросом и внутренним объединением, но это не увенчалось успехом ...!

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Вы можете использовать перекрестное соединение и внутреннее соединение

  SELECT t1.num_family, t2.CODE, count(*) 
  FROM family t1
  CROSS JOIN code t2 
  INNER JOIN stats t3 ON  t1.num_family LIKE '%FAM1%' AND t2.num_code LIKE '%FAM1%'
  GROUP BY t1.num_family, t2.CODE 
0 голосов
/ 07 сентября 2018

Похоже, вы соединяете первые две таблицы, например, с примерами данных, чтобы соответствовать тому, что вы показали в качестве вывода:

-- CTE for implied sample data
with family (num_family) as (
            select 'FAM1' from dual
  union all select 'FAM2' from dual
),
code (num_code) as (
            select 'CODE1' from dual
  union all select 'CODE2' from dual
  union all select 'CODE3' from dual
)
-- actual query (edited from what you showed to be valid)
--SELECT t1.FAM,t2.CODE FROM (SELECT t1.FAM, t2.CODE FROM (SELECT num_family FROM family) t1, (SELECT num_code FROM code) t2)
SELECT t1.FAM, t2.CODE FROM (SELECT num_family as fam FROM family) t1, (SELECT num_code as code FROM code) t2
/

FAM  CODE 
---- -----
FAM1 CODE1
FAM1 CODE2
FAM1 CODE3
FAM2 CODE1
FAM2 CODE2
FAM2 CODE3

, который даже не нуждается в этих подзапросах, так же как и:

select f.num_family, c.num_code from family f cross join code c

и затем вы хотите получить количество совпадающих liste значений в вашей таблице stats, где в эту строку встроены значения как семейства, так и кода, перед которым стоит хеш:

Я должен сделать СЛУЧАЙ, КОГДА СПИСОК НРАВИТСЯ '% #' || t1.FAM || '%' THEN (СЛУЧАЙ, КОГДА ЛИСТ LIKE '% #' || t2.CODE || '%' THEN 1 ELSE 0 END) ELSE 0 END вместо SELECT COUNT (*) FROM stats

Вы можете делать то, что с внешним соединением и логической логикой в ​​условии соединения, вместо того, чтобы пытаться использовать выражение case:

-- CTE for implied sample data
with family (num_family) as (
            select 'FAM1' from dual
  union all select 'FAM2' from dual
),
code (num_code) as (
            select 'CODE1' from dual
  union all select 'CODE2' from dual
  union all select 'CODE3' from dual
),
stats (liste) as (
            select 'abc #FAM1 def #CODE1 ghi' from dual connect by level <= 5
  union all select 'jkl #CODE2#FAM1 mno' from dual connect by level <= 2
  union all select '#FAM2#CODE1' from dual connect by level <= 9
  union all select '#FAM2#CODE2' from dual connect by level <= 4
  union all select '#FAM2#CODE3' from dual
  union all select '#FAM2#CODE4' from dual -- no match
  union all select '#FAM3#CODE1' from dual -- no match
)
-- actual query
select f.num_family, c.num_code, count(s.liste) as matches
from family f
cross join code c
left join stats s on s.liste like '%#'|| f.num_family ||'%'
and s.liste like '%#'|| c.num_code ||'%'
group by f.num_family, c.num_code
order by f.num_family, c.num_code;

NUM_ NUM_C    MATCHES
---- ----- ----------
FAM1 CODE1          5
FAM1 CODE2          2
FAM1 CODE3          0
FAM2 CODE1          9
FAM2 CODE2          4
FAM2 CODE3          1

Шаблон like будет проблематичным, если семейные или кодовые значения имеют перекрывающиеся корни или неожиданные частичные совпадения. Например. если бы у вас было liste значений #FAM10#CODE20, оно все равно совпадало бы с FAM1 и CODE2. Вы можете переключиться на regexp_like(), если сможете определить шаблон, чтобы избежать ложных совпадений (например, после пробела / пунктуации / EOL).

0 голосов
/ 06 сентября 2018

Вот то, о чем я подумал ... пожалуйста, проверьте, работает ли это:

SELECT COUNT (*)
  FROM stats
 WHERE     (num_fam, num_code) IN
              (SELECT t1.FAM, t2.CODE
                 FROM (SELECT num_family FROM family) t1,
                      (SELECT num_code FROM code) t2)
       AND NUM_FAM LIKE '%FAM1%' --I assumed this is a required filter .
       AND NUM_CODE LIKE '%FAM1%';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...