在 DB2 的子查询中连接表

JOIN tables inside a subquery in DB2

我在对 DB2 中的连接表进行分页时遇到问题。我想要 return 包含 INNER JOIN 的查询的第 10-30 行。

这个有效:

SELECT *
FROM (
    SELECT row_number() OVER (ORDER BY U4SLSMN.SLNAME) AS ID,
        U4SLSMN.SLNO, U4SLSMN.SLNAME, U4SLSMN.SLLC
    FROM U4SLSMN) AS P
WHERE P.ID BETWEEN 10 AND 30

这不起作用:

SELECT *
FROM (
    SELECT row_number() OVER (ORDER BY U4SLSMN.SLNAME) AS ID,
        U4SLSMN.SLNO, U4SLSMN.SLNAME, U4SLSMN.SLLC, U4CONST.C4NAME
    FROM U4SLSMN INNER JOIN U4CONST ON U4SLSMN.SLNO = U4CONST.C4NAME
) AS P
WHERE P.ID BETWEEN 10 AND 30

我得到的错误是:

Selection error involving field *N.

请注意,JOIN 查询本身可以正常工作,只是当它 运行 作为子查询时就不行了。

如何在 DB2 的子查询中执行连接?

我在 v7.1 TR9 上工作正常

这就是我的实际情况 运行:

select * 
from ( select rownumber() over (order by vvname) as ID, idescr, vvname
       from olsdta.ioritemmst 
            inner join olsdta.vorvendmst on ivndno = vvndno
     ) as P
where p.id between 10 and 30;

不过我更喜欢 CTE 版本:

with p as 
 ( select rownumber() over (order by vvname) as ID, idescr, vvname
     from olsdta.ioritemmst 
          inner join olsdta.vorvendmst on ivndno = vvndno
 ) 
select *
from p
where p.id between 10 and 30;

最后,请注意,在 7.1 TR11 (7.2 TR3) 中,IBM 添加了对 LIMIT 和 OFFSET 子句的支持。您的查询可以按如下方式重新完成:

SELECT 
      U4SLSMN.SLNO, U4SLSMN.SLNAME, U4SLSMN.SLLC, U4CONST.C4NAME
 FROM U4SLSMN INNER JOIN U4CONST ON U4SLSMN.SLNO = U4CONST.C4NAME 
ORDER BY U4SLSMN.SLNAME
LIMIT 20 OFFSET 9;

但是,请注意 LIMIT 和 OFFSET 子句仅在准备好的或嵌入的 SQL 中受支持。您不能在 STRSQL 或 STRQMQRY 中使用它们。我相信 "Run SQL Scripts" GUI 界面确实支持它们。这是一个 article about LIMIT & OFFSET