如何通过多个值获取记录?

时间:2018-11-08 12:50:47

标签: sql db2

我有下表:(请注意,目标仅用于说明)

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,我得到{{ 1}}

现在,我想更改该查询,以便我可以一次提供多个要查询的输入-(如果可能的话)(记录的顺序无关紧要,我只需要最新的 记录。)

我的目标是这样的

7

我想将其中的50个调用合并为一个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? 语句。 SELECT总共50行都是不可选择的。

(这将在带有DB2的COBOL程序中)

2 个答案:

答案 0 :(得分:0)

我不是DB2专家,但是据我所知,它支持ROW_NUMBER(),这是接近“ greatest-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

答案 1 :(得分:0)

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”的表的每一行,使用传递的“ parameters”执行括号内的相应选择语句。在那里使用“排序依据”和“首先获取”子句来选择所需的行。