Как получить записи по нескольким значениям? - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть следующая таблица: (обратите внимание, что цель уникальна только для иллюстрации)

a  | b  | TSD   | target
---|----|-------|-------
a1 | b1 |     1 |    1
a2 | b1 |     1 |    2
a1 | b2 |     1 |    3
a2 | b2 |     1 |    4
a1 | b1 |     2 |    5
a2 | b1 |     2 |    6
a1 | b2 |     2 |    7
a2 | b2 |     2 |    8

Теперь у меня есть выбор как

SELECT target FROM tab
WHERE a = :val-A
  AND b = :val-B
  AND TSD <= :val-TSD
ORDER BY TSD desc
FETCH FIRST 1 ROW ONLY;

Так что для входов a1 b1 1 Я получаю 1, для a1 b2 42 Я получаю 7

Теперь я хотел бы изменить этот запрос, чтобы я мог предоставить несколько таких входных данных для одновременного запроса - (если это возможно) (порядок записей не имеет значения, мне просто нужен новейший запись.)

Я бы нацелился примерно так:

SELECT a, b, target FROM tab
WHERE (a, b) in (
  (:val-a1, :val-b1)
 ,(:val-a2, :val-b2)
-- ...
 ,(:val-an, :val-bn)
  )
  AND TSD <= :val-TSD -- How to do the < per input?

FETCH FIRST 2 ROWS ONLY; -- How to only get the newest one per input?

Я хочу объединить 50 из этих вызовов в один оператор SELECT. UNION все 50 строк вместе не вариант.

(это будет внутри программы COBOL с DB2)

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018
select p.*, t.target
from param p, table(
select t.target 
from tab t 
where t.a=p.a and t.b=p.b and t.tsd<=p.tsd 
order by t.tsd desc
fetch first 1 row only
) t;

Вот пример «параметризованного» подвыбора.Логически это работает следующим образом:

Для каждой строки таблицы с параметрами «param» соответствующий оператор выбора внутри скобок выполняется с использованием переданных «параметров».Здесь используются предложения Order by и Fetch first, чтобы выбрать только нужные строки.

0 голосов
/ 08 ноября 2018

Я не эксперт DB2, но из того, что я вижу, он поддерживает ROW_NUMBER(), который является "обычным" способом приблизиться к "great-n-pre-group". (Вы хотите наибольшее 1 на группу)

SELECT
  *
FROM
(
  SELECT
    param.id   AS param_id,
    data.a,
    data.b
    data.TSD,
    data.target,
    ROW_NUMBER() OVER (PARTITION BY param.id ORDER BY data.TSD DESC)   AS data_row_id
  FROM
    data
  INNER JOIN
    param
      ON  data.a    = param.a
      AND data.b    = param.b
      AND data.TSD <= param.TSD
)
  AS results
WHERE
  results.data_row_id = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...