Sql DB2连接行
我试图查询iSeries DB2V6R1M0。我想借用你的答案 我已尝试将其应用于下面的查询,但失败。我正在尝试连接这些评论 原子抛出一个错误。它取自某个地方的一个答案。 @注释和注释不起作用。节是有效的令牌。不知道那是什么意思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
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