我正在使用两个具有一对多映射的表(在DB2中)。
我需要使用LEFT JOIN从两个表中使用ROW_NUMBER一次获取20条记录。但由于一对多映射,结果不一致。我可能会得到20条记录,但这些记录不包含第一张表的20条唯一记录
SELECT
A.*,
B.*,
ROW_NUMBER() OVER (ORDER BY A.COLUMN_1 DESC) as rn
from
table1
LEFT JOIN
table2 ON A.COLUMN_3 = B.COLUMN3
where
rn between 1 and 20
请提出一些解决方案。
答案 0 :(得分:1)
当然,这很容易......一旦你知道你可以使用子查询作为表引用:
SELECT <relevant columns from Table1 and Table2>, rn
FROM (SELECT <relevant columns from Table1>,
ROW_NUMBER() OVER (ORDER BY <relevant columns> DESC) AS rn
FROM table1) Table1
LEFT JOIN Table2
ON <relevant equivalent columns>
WHERE rn >= :startOfRange
AND rn < :startOfRange + :numberOfElements
对于生产代码,永远不要SELECT *
- 始终明确列出您想要的列(有几个原因)。
优先考虑(正)范围的包含下限(>=
),独占上限(<
)。对于一切 除了整数类型,这需要理智/干净地查询值。使用整数类型执行此操作既要保持一致,又要便于查询(请注意,您实际上不需要知道“停止”哪个值)。此外,在处理迭代值构造时,所示模式被认为是标准。
请注意,此查询目前有两个问题:
ORDER BY
列出足够的列以返回一致的结果。最好通过使用唯一值来完成 - 您可能需要优化器可以使用的索引中的某些内容。