Oracle - как объединить несколько строк в вертикально ориентированной таблице - PullRequest
0 голосов
/ 12 апреля 2019

Допустим, у меня есть две такие таблицы:

table1:
-----------------
| someId | value|
|--------|------|
| 1      | 2    |
| 2      | 3    |
| 3      | 4    |
-----------------

table2:
-----------------------------------
| someId | type | value1 | value2 |
|--------|------|--------|--------|
| 1      | 2    | hello  |        |
| 1      | 3    |        | 2      |
| 1      | 4    |        |        |
| 2      | 4    |        |        |
-----------------------------------

table1.someId = table2.someId

table2 является вертикальным, поэтому несколько строк этой таблицы (на основе someId) относятся к table1.someId.

Теперь мне нужно получить количество строк из table1, для которых table1.value=? И (table2.type=2 и table2.value1=?) И (table2.type=3 и table2.value2=?) объединены в table1.someId = table2.someId.

Это запрос, который у меня есть сейчас (он параметризован и параметры для value, value1 и value2 передаются от клиента):

select count(case when t1.value = ? then 1 end) from table1 t1
  inner join
  (select value1.someId from
    (select someId from table2 where type = 2 and value1 = ?) value1
    inner join
    (select someId from table2 where type = 3 and value2 = ?) value2
    on value1.someId = value2.someId
  ) t2
  on t1.someId = t2.someId;

Пример запроса:

select count(case when t1.value = 2 then 1 end) from table1 t1
  inner join
  (select value1.someId from
    (select someId from table2 where type = 2 and value1 ='hello') value1
    inner join
    (select someId from table2 where type = 3 and value2 = 2) value2
    on value1.someId = value2.someId
  ) t2
  on t1.someId = t2.someId;

Есть ли другой способ, как добиться этого, вместо нескольких select s, соединенных inner join s? (На самом деле мне нужно искать по трем types из table2).

Выполнение примера с правильным результатом (обновленный пример от Михаэля Буэна): db-fiddle.com

Спасибо.

1 Ответ

1 голос
/ 12 апреля 2019

Что вам нужно, так это написать собственный сводный отчет для наведения таблицы 2 кем-то перед соединением с таблицей 1:

with s (someId, type, value1, value2) as (
select 1, 2, 'hello', to_number(null) from dual union all
select 1, 3, null   , 2 from dual union all
select 1, 4, null   , null from dual union all
select 2, 4, null   , null from dual)
select someid,
max(case when type = 2 then value1 end) type2_value1,
max(case when type = 3 then value2 end) type3_value2/*,
max(case when type = 4 then value1 end) type4_value1
max(case when type = 4 then value2 end) type4_value2*/
from s
group by someid;

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