Допустим, у меня есть две такие таблицы:
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
Спасибо.