Sql DB2连接行

Sql DB2连接行,sql,db2,ibm-midrange,Sql,Db2,Ibm Midrange,我试图查询iSeries DB2V6R1M0。我想借用你的答案 我已尝试将其应用于下面的查询,但失败。我正在尝试连接这些评论 原子抛出一个错误。它取自某个地方的一个答案。 @注释和注释不起作用。节是有效的令牌。不知道那是什么意思 BEGIN ATOMIC DECLARE @comments varchar(100) SELECT mh.ID ,mh.OtherStuff ,me.ID ,@Comments = COALESCE(@Comments + '<b

我试图查询iSeries DB2V6R1M0。我想借用你的答案

我已尝试将其应用于下面的查询,但失败。我正在尝试连接这些评论

原子抛出一个错误。它取自某个地方的一个答案。 @注释和注释不起作用。节是有效的令牌。不知道那是什么意思

BEGIN ATOMIC
DECLARE @comments varchar(100)
SELECT
    mh.ID
    ,mh.OtherStuff
    ,me.ID
    ,@Comments = COALESCE(@Comments + '<br />' ,") + me.Comment


FROM
    /*insertTblName*/ mh

INNER JOIN 
    /*insertTblName*/ me
    ON 
        me.ID = mh.ID
WHERE
    me.ID = @parameter
END
我正在努力做到这一点

ID Comment 0 Hello 0 World 1 Foo 1 Bar 到

ID Comment 0 Hello World 1 Foo Bar
在ADO.Net中使用SQL语句之前,我通常先在System I Navigator中测试SQL语句。

尝试使用此示例和数据来了解该过程,并告诉我您是否解决了该问题

CREATE TABLE QTEMP/EMP (DEPTNO NUMERIC NOT NULL WITH DEFAULT, ENAME
CHAR ( 10) NOT NULL WITH DEFAULT, EMPNO NUMERIC NOT NULL WITH      
DEFAULT);                                                           


insert into emp values (10,'CLARK ',1),  
                       (10,'KING  ',2),  
                       (10,'MILLER',3),  
                       (20,'SMITH ',4),  
                       (20,'ADAMS ',5),  
                       (20,'FORD  ',6),  
                       (20,'SCOTT ',7),  
                       (20,'JONES ',8),  
                       (30,'ALLEN ',9),  
                       (30,'BLAKE ',10), 
                       (30,'MARTIN',11), 
                       (30,'JAMES ',12), 
                       (30,'TURNER',13), 
                       (30,'WARD  ',14)  

with x (deptno, cnt, list, empno, len)                             
 as (                                                               
select z.deptno, (select count(*) from emp y where y.deptno=z.deptno                                                   group by y.deptno)   
, cast(ename as varchar(100)), empno, 1                             
 from emp z                                                         
 union all                                                          
 select x.deptno, x.cnt, x.list ||' '|| e.ename, e.empno, x.len+1   
 from emp e, x                                                      
 where e.deptno = x.deptno                                          
 and e.empno > x. empno                                             
 )                                                                  
 select deptno, list                                                
 from x                                                             
 where len=cnt
这就是结果

DEPTNO   LIST                                                                        
    10   CLARK      KING       MILLER                                                
    20   SMITH      ADAMS      FORD       SCOTT      JONES                           
    30   ALLEN      BLAKE      MARTIN     JAMES      TURNER     WARD                 

优秀的代码,狱警!这对我来说效果很好

我只是稍微修改了您的代码,使其更通用:我删除了任意列,而是使用相对记录编号来跟踪原始记录

它至少在V7R1上仍然可以正常工作

CREATE TABLE QTEMP/EMP 
(
  DEPTNO NUMERIC    NOT NULL WITH DEFAULT,
  ENAME CHAR ( 10)  NOT NULL WITH DEFAULT
);  


insert into emp values (10,'CLARK '),  
                       (10,'KING  '),  
                       (10,'MILLER'),  
                       (20,'SMITH '),  
                       (20,'ADAMS '),  
                       (20,'FORD  '),  
                       (20,'SCOTT '),  
                       (20,'JONES '),  
                       (30,'ALLEN '),  
                       (30,'BLAKE '), 
                       (30,'MARTIN'), 
                       (30,'JAMES '), 
                       (30,'TURNER'), 
                       (30,'WARD  ')  
;


-- Original data:
select * from qtemp/emp  ;


-- Pivoted and grouped data:
with x (deptno, cnt, list, empno, len) as
 (select z.deptno, 
   (select count(*) from emp y 
    where y.deptno=z.deptno 
    group by y.deptno),
  cast(z.ename as varchar(100)),
  rrn(z), 1  
  from emp z 
 union all  
  select x.deptno,
     x.cnt,
     strip(x.list) ||', '|| e.ename,
     rrn(e),
     x.len+1   
  from emp e, x 
  where e.deptno = x.deptno and rrn(e) > x. empno 
 )  
 select deptno, list, len headcount 
 from x 
 where len=cnt 
;
产生的输出如下所示:

原始数据:

DEPTNO  ENAME
10      CLARK       
10      KING        
10      MILLER      
20      SMITH       
20      ADAMS       
20      FORD        
20      SCOTT       
20      JONES       
30      ALLEN       
30      BLAKE       
30      MARTIN      
30      JAMES       
30      TURNER      
30      WARD        
数据透视和分组数据:

DEPTNO  LIST                                    HEADCOUNT
10      CLARK, KING, MILLER                             3   
20      SMITH, ADAMS, FORD, SCOTT, JONES                5       
30      ALLEN, BLAKE, MARTIN, JAMES, TURNER, WARD       6   

请解释您试图实现的目标。在使用DB2时,您可能希望使用DB2 SQL而不是SQL Server T-SQL。v6.1不支持复合语句,即BEGIN…END,除非在存储过程或UDF中。另外,您是如何执行SQL的?缺乏活力?您引用的链接包含一个“递归CTE”的示例。这是最有可能对DB2fori6.1起作用的形式。您尝试的T-SQL很可能无法工作,因为很多T-SQL不是跨平台的,而是仅限Windows。警告!SQL按定义没有表顺序的概念。除非您有第三列进行排序,否则您将有50%的时间收到World Hello。请注意,RRN不会保证将来按所需顺序访问行。不能保证在SQL表中按RRN顺序添加行。应包括引用表中某列的ORDER BY子句。@user2338816-您的回答是正确的,RRN可能只是随机整数。不仅在将来,如果原始表aka physical file是用REUSEDLT*YES定义的,那么现在就可能发生这种情况。然而,此代码不使用RRN进行排序,只用于识别唯一的记录,因此即使RRN是随机的,它也应该工作。当然,如果需要结果集中的任何特定顺序,order BY就是这样做的。示例显示了与示例数据中列出的顺序相匹配的串联单词。我的未来意味着,无论今天的结果如何,相同的顺序可能不会导致未来的运行。我只引用了SQL表,因为它们默认为REUSEDLT*YES。OP应该知道顺序是由顺序决定的,如果重要的话。我只建议你修改你的答案来提及它。
DEPTNO  LIST                                    HEADCOUNT
10      CLARK, KING, MILLER                             3   
20      SMITH, ADAMS, FORD, SCOTT, JONES                5       
30      ALLEN, BLAKE, MARTIN, JAMES, TURNER, WARD       6