[英]SQL - Combining information with similar primary key/ID
我知道之前有人问过这个问题,但针对该问题给出的解决方案对我不起作用。 我无法写评论来说明我的问题,因为我需要 50 点声望。
细节:
甲骨文版本 10g
提供的解决方案:
select book_id,
'Total Hours of Loan: ' || to_char(sum(hours_of_loan)) || chr(10) ||
lpad('-', 30, '-') || chr(10) ||
xmlagg(xmlelement(x, descr, chr(10) || lpad('-', 30, '-') || chr(10)).extract('//text()')
order by date_of_loan) as book_description
from (
select book_id, date_of_loan, hours_of_loan,
'Written by: ' || checked_by || chr(10) ||
'Date of Loan : ' || to_char(date_of_loan, 'mm/dd/yy') || chr(10) ||
'Hour(s) of Loan: ' || to_char(hours_of_loan) || chr(10) ||
'Comments: ' || comments || chr(10) ||
'Student: ' || student as descr
from student_book
)
group by book_id
order by book_id
;
我尝试用假数据创建一个虚拟表来测试逻辑,看看它是否适合我,它确实适用。 但是当我对我的真实数据使用查询时,它提示了一个错误:
ORA-22813: 操作数值超出系统限制
错误提示
看了之后,发现是因为我的数据太大了。
我尝试创建表和从中调用的查询
DECLARE
sSUM_TEXT CLOB;
sBOOK_ID VARCHAR2(10):= '1';
nCount NUMBER:=1;
BEGIN
FOR rRECORDRec IN(SELECT BOOK_ID, CHECKED_BY, DATE_OF_lOAN, HOURS_OF_LOAN, COMMENTS, STUDENT
FROM STUDENT_BOOK
WHERE BOOK_ID = '1')
LOOP
IF nCount != 1 THEN
sSUM_TEXT := sSUM_TEXT||chr(10)||
'Written by: ' || rRECORDRec.checked_by || chr(10) ||
'Date of Loan : ' || rRECORDRec.date_of_loan || chr(10) ||
'Hour(s) of Loan: ' || rRECORDRec.hours_of_loan || chr(10) ||
'Comments: ' || rRECORDRec.comments || chr(10) ||
'Student: ' || rRECORDRec.student || chr(10) ||
'--------------------------------';
ELSE
sSUM_TEXT := 'Written by: ' || rRECORDRec.checked_by || chr(10) ||
'Date of Loan : ' || rRECORDRec.date_of_loan || chr(10) ||
'Hour(s) of Loan: ' || rRECORDRec.hours_of_loan || chr(10) ||
'Comments: ' || rRECORDRec.comments || chr(10) ||
'Student: ' || rRECORDRec.student || chr(10) ||
'--------------------------------';
END IF;
nCount := nCount + 1;
END LOOP;
INSERT INTO COMMENTS_SUMMARY(BOOK_ID,SUM_TEXT)
VALUES (sBOOK_ID,sSUM_TEXT);
COMMIT;
END;
这并没有真正解决我的问题,但它结合了所有具有特定 BOOK_ID 但没有格式的“评论”
尝试过的解决方案
select book_id,
'Total Hours of Loan: ' || to_char(sum(hours_of_loan)) || chr(10) ||
lpad('-', 30, '-') || chr(10) ||
xmlagg(xmlelement(x, descr, chr(10) || lpad('-', 30, '-') || chr(10)).extract('//text()')
order by date_of_loan) as book_description
from (
select book_id, date_of_loan, hours_of_loan,
to_clob('Written by: ' || checked_by || chr(10) ||
'Date of Loan : ' || date_of_loan || chr(10) ||
'Hour(s) of Loan: ' || hours_of_loan || chr(10) ||
'Comments: ' || comments || chr(10) ||
'Student: ' || student) as descr
from student_book
)
group by book_id
order by book_id;
提示同样的错误
第二条 SELECT 语句
我尝试单独运行查询。 我为我的真实数据运行了第二个 SELECT 语句,即使没有TO_CLOB也没有提示任何错误
select book_id, date_of_loan, hours_of_loan,
'Written by: ' || checked_by || chr(10) ||
'Date of Loan : ' || date_of_loan || chr(10) ||
'Hour(s) of Loan: ' || hours_of_loan || chr(10) ||
'Comments: ' || comments || chr(10) ||
'Student: ' || student as descr
from student_book
order by book_id
)
--group by book_id
order by book_id;
我的问题:
我如何克服这个问题并根据他们的 ID 对数据库进行分组?
可能至少有几本书的外借量过多,因此 XMLAGG 中内置的字符串长度超过 4000 个字符。 所以你必须处理 CLOB。
您需要在此处添加.getclobval()
:
... order by date_of_loan).getclobval() as book_description
甚至一个“贷款”的文本也可能已经太长(超过 4000 个字符)。 这是连接的一个问题 - 如果所有输入都少于 4000 个字符,Oracle 将它们视为 VARCHAR2 并期望结果也是 VARCHAR2(不超过 4000 个字符)。 要“强制”它将所有内容都视为 CLOB,只需将第一个输入设为 CLOB。
而不是'Written by: '
(在代码中找到它)使用
... to_clob('Written by: ')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.