2013-06-05 6 views
0

아래와 비슷한 쿼리가 있습니다 (더 복잡 하긴하지만). 실행하면 다음 오류가 발생합니다. 내 그룹 by 문에 ORA-22818: Subquery expressions not allowed here.그룹 별 하위 쿼리 (ORACLE 9i)

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 그냥 별개의 행을 끌어 GROUP BY을 사용하고 같은

SELECT table1.ID 
     NVL(fget_office(fget_last_catc_id_by_date((SELECT MAX(table3.date) FROM table3 INNER JOIN table1 ON table1.ID = table3.id),table1.NUM), fget_max_split_line_no('FILL',(SELECT MAX table3.tc_id) FROM table3 INNER JOIN table1 ON table1.ID = table3.ID INNER JOIN table4 ON table3.tc_id = table3.tc_id))), table1.distribution) "OFFICE", --eper.DISTRIBUTION "OFFICE", 
     table1.name 
    FROM table1 
    LEFT JOIN table2 
    ON table1.ID = table2.ID 
WHERE table1.company in ('CP01', 'CP02') 
GROUP BY table1.ID, 
      NVL(fget_office(fget_last_catc_id_by_date((SELECT MAX(table3.date) FROM table3 INNER JOIN table1 ON table1.ID = table3.id),table1.NUM), fget_max_split_line_no('FILL',(SELECT MAX table3.tc_id) FROM table3 INNER JOIN table1 ON table1.ID = table3.ID INNER JOIN table4 ON table3.tc_id = table3.tc_id))), table1.distribution),   
      table1.name 

답변

1

귀하의 코드 샘플 보인다. 이 경우,이 시도 : 당신이 정말로 당신의 "진짜"쿼리에서 집계하고있는 경우

SELECT DISTINCT 
     table1.ID 
     NVL(fget_office(fget_last_catc_id_by_date((SELECT MAX(table3.date) FROM table3 INNER JOIN table1 ON table1.ID = table3.id),table1.NUM), fget_max_split_line_no('FILL',(SELECT MAX table3.tc_id) FROM table3 INNER JOIN table1 ON table1.ID = table3.ID INNER JOIN table4 ON table3.tc_id = table3.tc_id))), table1.distribution) "OFFICE", --eper.DISTRIBUTION "OFFICE", 
     table1.name 
    FROM table1 
    LEFT JOIN table2 
    ON table1.ID = table2.ID 
WHERE table1.company in ('CP01', 'CP02') 

는 빠른 해결 방법은 오라클 9i에 지원되는 공통 테이블 식 (CTE)를 사용하는 것입니다. 이러한 기능의 결과가 직접 또는 간접적으로 표 1의 값에 의해 결정처럼

WITH x AS (
    SELECT table1.ID 
     NVL(fget_office(fget_last_catc_id_by_date((SELECT MAX(table3.date) FROM table3 INNER JOIN table1 ON table1.ID = table3.id),table1.NUM), fget_max_split_line_no('FILL',(SELECT MAX table3.tc_id) FROM table3 INNER JOIN table1 ON table1.ID = table3.ID INNER JOIN table4 ON table3.tc_id = table3.tc_id))), table1.distribution) "OFFICE", --eper.DISTRIBUTION "OFFICE", 
     table1.name, 
     some_value 
    FROM table1 
    LEFT JOIN table2 
     ON table1.ID = table2.ID 
    WHERE table1.company in ('CP01', 'CP02') 
) 
SELECT ID, OFFICE, name, SUM(some_value) 
FROM x 
GROUP BY ID, Office, name 
1

그것은 나에게 보이는 :이 예제는 some_value라는 이름의 열을 합산하고 가정합니다.

그렇다면 table1과 table2의 간단한 데이터 세트에서 고유 한 연산을 수행 한 후 함수를 적용 할 수 있습니다. 이렇게하면 함수 호출 수가 줄어들고 효율성이 향상됩니다.

with cte1 as (
    select 
    table1.id 
    table1.num 
    table1.distribution, 
    table1.name 
    from 
    table1 left join table2 on (table1.id = table2.id) 
where 
    table1.company in ('CP01', 'CP02')) 
select 
    cte1.id, 
    coalesce(
    fget_office(
     fget_last_catc_id_by_date(
     (select max(table3.date) 
     from table3 inner join cte1 on cte1.id = table3.id), 
     cte1.num), 
     fget_max_split_line_no(
     'FILL', 
     (select max(table3.tc_id) 
     from table3 inner join cte1 on cte1.id  = table3.id 
         inner join table4 on table3.tc_id = table3.tc_id))), 
    table1.distribution) office 
    cte1.name 
from cte1 
/
당신은뿐만 아니라 NVL()로) 합체를 (사용에 익숙해 수

- 그것은 PL 많이 ANSI 더 유연, 준수, 그것은 당신의 코드베이스의 편리한 그래서 단락 회로 평가 기능이있어/SQL에서 호출되는 SQL 함수.