如何将子查询行合并到Oracle中的一列中?

时间:2013-08-26 21:51:17

标签: sql oracle

我正在使用FileNet。我正在尝试将文档可能存档的文件夹显示在以分号分隔的记录集的一列中。这是之前决定的布局,我的任务是让Oracle做到这一点。以下是我到目前为止的查询内容:

SELECT d1.F_DOCNUMBER,
d1.F_DOCCLASSNUMBER,
d1.F_ENTRYDATE,
d1.F_ARCHIVEDATE,
d1.F_RETENTBASE,
d1.F_RETENTDISP,
d1.F_RETENTOFFSET,
d1.F_PAGES,
d1.F_DOCTYPE,
d1.F_DOCFORMAT,
d1.A32 AS CERT_NUM,
d1.A35 AS DOC_TYPE,
d1.A36 AS BATCH_KEY,
d1.A37 AS FIELD_REP_CODE,
d1.A38 AS EFFECTIVE_DATE,
d1.A39 AS VOUCH_NUM_HIGH,
d1.A40 AS VOUCH_NUM_LOW,
f1.Folders
FROM doctaba d1
LEFT JOIN (SELECT SUBSTR (SYS_CONNECT_BY_PATH (F_FOLDERNAME , ';'), 2) Folders
    FROM (SELECT fc2.F_DOCNUMBER, f2.F_FOLDERNAME, ROW_NUMBER () OVER (ORDER BY f2.F_FOLDERNAME) rn, COUNT (*) OVER () cnt
            FROM folder_contents fc2
            INNER JOIN folder f2
            ON f2.F_FOLDERNUMBER = fc2.F_FOLDERNUMBER
            WHERE fc2.F_DOCNUMBER = d1.F_DOCNUMBER)
    WHERE rn = cnt
    START WITH rn = 1
    CONNECT BY rn = PRIOR rn + 1) f1
ON d1.F_DOCNUMBER = f1.F_DOCNUMBER
WHERE d1.F_DOCTYPE IS NULL
AND d1.F_DOCNUMBER >= 107777
AND d1.F_DOCNUMBER <= 305791
ORDER BY d1.F_DOCNUMBER;

问题是d1.F_DOCNUMBER被标记为无效标识符。我在一些论坛上读到Oracle可能不会让该列标识符在多个查询级别下工作。任何人都有一些关于如何使这项工作的建议?谢谢!

编辑: 这是我的原始查询,只包含行中的文件夹值。

SELECT doctaba.F_DOCNUMBER,
doctaba.F_DOCCLASSNUMBER,
doctaba.F_ENTRYDATE,
doctaba.F_ARCHIVEDATE,
doctaba.F_RETENTBASE,
doctaba.F_RETENTDISP,
doctaba.F_RETENTOFFSET,
doctaba.F_PAGES,
doctaba.F_DOCTYPE,
doctaba.F_DOCFORMAT,
doctaba.A32 AS CERT_NUM,
doctaba.A35 AS DOC_TYPE,
doctaba.A36 AS BATCH_KEY,
doctaba.A37 AS FIELD_REP_CODE,
doctaba.A38 AS EFFECTIVE_DATE,
doctaba.A39 AS VOUCH_NUM_HIGH,
doctaba.A40 AS VOUCH_NUM_LOW,
folder.F_FOLDERNAME
FROM doctaba
LEFT JOIN folder_contents
ON doctaba.F_DOCNUMBER = folder_contents.F_DOCNUMBER
INNER JOIN folder
ON folder.F_FOLDERNUMBER = folder_contents.F_FOLDERNUMBER
WHERE doctaba.F_DOCTYPE IS NULL
AND doctaba.F_DOCNUMBER >= 107777
AND doctaba.F_DOCNUMBER <= 17208174
ORDER BY doctaba.F_DOCNUMBER;

1 个答案:

答案 0 :(得分:0)

在这种情况下,你很幸运。您只从子查询中获取一个值,因此您可以在select子句中将其作为相关子查询:

SELECT . . .
       (SELECT SUBSTR(SYS_CONNECT_BY_PATH (F_FOLDERNAME , ';'), 2) as Folders
        FROM (SELECT fc2.F_DOCNUMBER, f2.F_FOLDERNAME,
                     ROW_NUMBER () OVER (ORDER BY f2.F_FOLDERNAME) rn,
                     COUNT (*) OVER () cnt
              FROM folder_contents fc2 INNER JOIN
                   folder f2
                   ON f2.F_FOLDERNUMBER = fc2.F_FOLDERNUMBER
              WHERE fc2.F_DOCNUMBER = d1.F_DOCNUMBER
             )
        WHERE rn = cnt
        START WITH rn = 1
        CONNECT BY rn = PRIOR rn + 1
       ) as Folders
FROM doctaba d1
WHERE d1.F_DOCTYPE IS NULL AND
      d1.F_DOCNUMBER >= 107777 AND
      d1.F_DOCNUMBER <= 305791
ORDER BY d1.F_DOCNUMBER;