简体   繁体   中英

oracle not a group by function with nested query

I do not understand why this query does not work.

Original query working on 3x servers.

SELECT (
        SELECT to_char(RTRIM(XMLAGG(XMLELEMENT(e, TEXT, ',').EXTRACT('//text()')).GetClobVal(), ',')) CM_LINES
        FROM (
            SELECT DISTINCT to_char(cmline) TEXT
            FROM CCP.comms_matrix_data
            WHERE comms_matrix_id = :pkid
                AND src_net = t1.SRC_NET
                AND dst_net = t1.DST_NET
            ORDER BY cmline
            )
        ) CM_LINES
    ,t1.SRC_NET
    ,t1.DST_NET
    ,t1.SRC_NETZONE
    ,t1.DST_NETZONE
    ,t1.RPA
    ,t1.RPN
FROM CCP.comms_matrix_data t1
WHERE (t1.COMMS_MATRIX_ID = :pkid)
    AND (LOWER(t1.STATUS) LIKE '%implement%')
GROUP BY t1.SRC_NET
    ,t1.DST_NET
    ,t1.SRC_NETZONE
    ,t1.DST_NETZONE
    ,t1.RPA
    ,t1.RPN

On dev server this errors with ORA-00904: "T1"."DST_NET": invalid identifier 00904. 00000 - "%s: invalid identifier"

on my dev server it does not work so I decided to rewrite the query to:

SELECT CM_LINES.CM_LINES
    ,t1.SRC_NET
    ,t1.DST_NET
    ,t1.SRC_NETZONE
    ,t1.DST_NETZONE
    ,t1.RPA
    ,t1.RPN
FROM CCP.comms_matrix_data t1,
(
        SELECT to_char(RTRIM(XMLAGG(XMLELEMENT(e, TEXT, ',').EXTRACT('//text()')).GetClobVal(), ',')) CM_LINES, src_net, dst_net
        FROM (
            SELECT DISTINCT to_char(cmline) TEXT, src_net, dst_net
            FROM CCP.comms_matrix_data
            WHERE comms_matrix_id = :pkid

            ORDER BY cmline
            )
        ) CM_LINES
WHERE (t1.COMMS_MATRIX_ID = :pkid)
    AND (LOWER(t1.STATUS) LIKE '%implement%')
    AND CM_LINES.src_net = t1.SRC_NET
    AND CM_LINES.dst_net = t1.DST_NET
GROUP BY CM_LINES.CM_LINES
    ,t1.SRC_NET
    ,t1.DST_NET
    ,t1.SRC_NETZONE
    ,t1.DST_NETZONE
    ,t1.RPA
    ,t1.RPN;

on dev server this errors with ORA-00937: not a single-group group function 00937. 00000 - "not a single-group group function"

@Gordon

UPDATE

SELECT x.CM_LINES
    ,t1.SRC_NET
    ,t1.DST_NET
    ,t1.SRC_NETZONE
    ,t1.DST_NETZONE
    ,t1.RPA
    ,t1.RPN
FROM CCP.comms_matrix_data t1
JOIN (
    SELECT to_char(RTRIM(XMLAGG(XMLELEMENT(e, cml.TEXT, ',').EXTRACT('//text()')).GetClobVal(), ',')) CM_LINES
        ,src_net
        ,dst_net
    FROM (
        SELECT DISTINCT to_char(cmline) TEXT
            ,src_net
            ,dst_net
        FROM CCP.comms_matrix_data
        WHERE comms_matrix_id = :pkid
        ORDER BY cmline
        ) cml ON cml.src_net = t1.SRC_NET /* sql developer reports problem here*/
        AND cml.dst_net = t1.DST_NET
    WHERE t1.COMMS_MATRIX_ID = :pkid
        AND LOWER(t1.STATUS) LIKE '%implement%'
    GROUP BY src_net
        ,dst_net
    ) x
GROUP BY x.CM_LINES
    ,t1.SRC_NET
    ,t1.DST_NET
    ,t1.SRC_NETZONE
    ,t1.DST_NETZONE
    ,t1.RPA
    ,t1.RPN;

UPDATE 2

If I Try the following i get error on group by ORA-00905: missing keyword 00905. 00000 - "missing keyword"

SELECT x.CM_LINES
    ,t1.SRC_NET
    ,t1.DST_NET
    ,t1.SRC_NETZONE
    ,t1.DST_NETZONE
    ,t1.RPA
    ,t1.RPN
FROM CCP.comms_matrix_data t1
JOIN (
    SELECT to_char(RTRIM(XMLAGG(XMLELEMENT(e, cml.TEXT, ',').EXTRACT('//text()')).GetClobVal(), ',')) CM_LINES
        ,src_net
        ,dst_net
    FROM (
        SELECT DISTINCT to_char(cmline) TEXT
            ,src_net
            ,dst_net
        FROM CCP.comms_matrix_data
        WHERE comms_matrix_id = :pkid
        ORDER BY cmline
        ) cml 
    join cml ON cml.src_net = t1.SRC_NET
        AND cml.dst_net = t1.DST_NET
    WHERE t1.COMMS_MATRIX_ID = :pkid
        AND LOWER(t1.STATUS) LIKE '%implement%'
    GROUP BY src_net
        ,dst_net
    ) x /* should there not be an on clause here? */
GROUP BY x.CM_LINES /* error here */
    ,t1.SRC_NET
    ,t1.DST_NET
    ,t1.SRC_NETZONE
    ,t1.DST_NETZONE
    ,t1.RPA
    ,t1.RPN;

You need a GROUP BY in the subquery:

SELECT CM_LINES, t1.SRC_NET, t1.DST_NET,
       t1.SRC_NETZONE, t1.DST_NETZONE, t1.RPA, t1.RPN
FROM CCP.comms_matrix_data t1 JOIN
     (SELECT to_char(RTRIM(XMLAGG(XMLELEMENT(e, TEXT, ',').EXTRACT('//text()')).GetClobVal(), ',')) as CM_LINES,
             src_net, dst_net
      FROM (SELECT to_char(cmline) as TEXT, src_net, dst_net,
                   ROW_NUMBER() OVER (PARTITION BY src_net, dst_net ORDER BY cmline DESC) as seqnum
            FROM CCP.comms_matrix_data
            WHERE comms_matrix_id = :pkid
           ) CM_LINES
           ON CM_LINES.src_net = t1.SRC_NET AND
               CM_LINES.dst_net = t1.DST_NET AND
               seqnum = 1
      WHERE t1.COMMS_MATRIX_ID = :pkid AND
            LOWER(t1.STATUS) LIKE '%implement%'
      GROUP BY src_net, dst_net
     ) x
GROUP BY CM_LINES, t1.SRC_NET, t1.DST_NET
         t1.SRC_NETZONE, t1.DST_NETZONE, t1.RPA, t1.RPN;

XMLAGG() is an aggregation function.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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