2016-03-01 32 views
0

我在DB2中對連接表進行分頁時遇到問題。我想返回包含INNER JOIN的查詢的第10-30行。在DB2中的子查詢中加入表格

這工作:

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 

我得到的錯誤是:

選擇錯誤,涉及領域* N。

請注意,JOIN查詢本身正確工作,而不是當它作爲子查詢運行時。

如何在DB2中的子查詢中執行連接?

回答

1

對我的作品罰款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中使用它們。我相信「運行SQL腳本」GUI界面確實支持它們。這裏有一個article about LIMIT & OFFSET