如何通过多个值获取记录



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

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;

因此,对于输入a1b11,我得到1,对于a1b242,我得到了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行加在一起不是一个选项。

(这将在DB2的COBOL程序中(

我不是DB2专家,但据我所见,它支持ROW_NUMBER(),这是接近"最伟大的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
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"的表的每一行,括号内相应的select语句将使用传递的"parameters"执行。"Order by"one_answers"Fetch first"子句仅用于选择所需的行。

最新更新