Є ще один варіант: with
синтаксис. Щоб використати приклад OP, це виглядатиме так:
with data as (
select 'value1' name from dual
union all
select 'value2' name from dual
union all
...
select 'value10000+' name from dual)
select field1, field2, field3
from table1 t1
inner join data on t1.name = data.name;
Я зіткнувся з цією проблемою. У моєму випадку у мене був список даних на Java, де кожен елемент мав item_id та customer_id. У мене є дві таблиці в БД з підписками на елементи відповідних клієнтів. Я хочу отримати список усіх підписок на товари або замовника на цей товар разом з ідентифікатором товару.
Я спробував три варіанти:
- Кілька виділень з Java (за допомогою кортежів, щоб обійти межу)
- З-синтаксисом
- Тимчасовий стіл
Варіант 1: Кілька виділень з Java
В основному, я спочатку
select item_id, token
from item_subs
where (item_id, 0) in ((:item_id_0, 0)...(:item_id_n, 0))
Тоді
select cus_id, token
from cus_subs
where (cus_id, 0) in ((:cus_id_0, 0)...(:cus_id_n, 0))
Потім я будую карту в Java з ключем cus_id і списком елементів як значенням, і для кожного знайденого підписки клієнта додаю (до списку, що повертається з першого вибору) запис для всіх відповідних елементів із цим елементом_id. Це набагато мессіє код
Варіант 2: With-синтаксис
Отримайте все відразу за допомогою SQL, подібного
with data as (
select :item_id_0 item_id, :cus_id_0 cus_id
union all
...
select :item_id_n item_id, :cus_id_n cus_id )
select I.item_id item_id, I.token token
from item_subs I
inner join data D on I.item_id = D.item_id
union all
select D.item_id item_id, C.token token
from cus_subs C
inner join data D on C.cus_id = D.cus_id
Варіант 3: Тимчасова таблиця
Створіть глобальну тимчасову таблицю з трьома полями: rownr (первинний ключ), item_id та cus_id. Вставте всі дані туди, а потім запустіть дуже подібний вибір до варіанту 2, але посилання у тимчасовій таблиці замістьwith data
Продуктивність
Це не повністю науковий аналіз ефективності.
- Я бігаю проти бази даних розробників, у наборі даних трохи більше 1000 рядків, на які я хочу знайти підписки.
- Я спробував лише один набір даних.
- Я перебуваю не в тому ж фізичному розташуванні, що і мій сервер БД. Це не так далеко, але я помічаю, якщо я спробую з дому через VPN, то це все набагато повільніше, хоча це однакова відстань (і проблема не в моєму домашньому Інтернеті).
- Я тестував повний виклик, тому мій API викликає інший (який також працює в тому ж екземплярі в dev), який також підключається до БД, щоб отримати початковий набір даних. Але це однаково у всіх трьох випадках.
YMMV.
Тим не менш, варіант тимчасового столу був набагато більшим повільнішим. Як у подвійному так повільно. Я отримував 14-15 секунд для варіанту 1, 15-16 для варіанту 2 і 30 для варіанту 3.
Я спробую їх знову з тієї ж мережі, що і сервер БД, і перевірю, чи це не змінює ситуації, коли я отримаю можливість.