使用ROW NUM DB2进行LEFT JOIN

时间:2014-02-21 20:22:25

标签: sql db2 left-join

我正在使用两个具有一对多映射的表(在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

请提出一些解决方案。

1 个答案:

答案 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 * - 始终明确列出您想要的列(有几个原因)。
优先考虑(正)范围的包含下限(>=),独占上限(<)。对于一切 除了整数类型,这需要理智/干净地查询值。使用整数类型执行此操作既要保持一致,又要便于查询(请注意,您实际上不需要知道“停止”哪个值)。此外,在处理迭代值构造时,所示模式被认为是标准。

请注意,此查询目前有两个问题:

  1. 您需要为ORDER BY列出足够的列以返回一致的结果。最好通过使用唯一值来完成 - 您可能需要优化器可以使用的索引中的某些内容。
  2. 每次运行此查询时,您(通常)必须先订购整个结果集,然后才能获得所需的任何切片(尤其是第一页之后的任何内容)。如果您的数据集很大,look at the answers to this question可以提供一些性能改进的建议。优化器可以能够为您缓存结果,但不能保证(特别是在接收许多更新的表上)。