繁体   English   中英

SQL - 结合具有相似主键/ID 的信息

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM