2012-04-10 4 views
5

Oracle을 사용하여 하위 쿼리 외부의 열을 어떻게 참조 할 수 있습니까? 하위 쿼리의 WHERE 문에서이를 사용해야합니다.하위 쿼리 (Oracle)의 상위 쿼리 열 참조

SELECT Item.ItemNo, Item.Group 
FROM Item 
    LEFT OUTER JOIN (SELECT Attribute.Group, COUNT(1) CT 
        FROM Attribute 
        WHERE Attribute.ItemNo=12345) A ON A.Group = Item.Group 
WHERE Item.ItemNo=12345 

내가 서브 쿼리에 WHERE Attribute.ItemNo=Item.ItemNoWHERE Attribute.ItemNo=12345을 변경하려면,하지만이 가능한 경우 나는 알아낼 수 없습니다 :

기본적으로 나는이 있습니다. 나는 점점 계속 "ORA-00904를 '항목을' 'ITEMNO'. 잘못된 식별자"

편집 :

내가 원하는 : 나는 구조의이 종류를 필요로하는 이유

좋아, 이것이 "오류"레코드 (항목에 값이 누락 된 위치) 및 "확인"레코드 (항목에 값이있는 위치)의 수를 가져올 수 있어야합니다.

내가 바이올린에서 설정 한 방법은 올바른 데이터를 반환합니다. 나는 하위 쿼리 각각의 값을 채우기 만하는 것이 좋을 것 같아요. 아마도 이것이 가장 쉬운 방법 일 것이기 때문입니다. 미안 데이터 구조가 조금 복잡한 경우. 필요한 경우 설명 할 수 있습니다.

내 테이블은 다음과 같습니다

create table itemcountry(
    itemno number, 
    country nchar(3), 
    imgroup varchar2(10), 
    imtariff varchar2(20), 
    exgroup varchar2(10), 
    extariff varchar2(20)); 

create table itemattribute(
    attributeid varchar2(10), 
    tariffgroup varchar2(10), 
    tariffno varchar2(10)); 

create table icav(
    itemno number, 
    attributeid varchar2(10), 
    value varchar2(10)); 

내 쿼리 지금까지입니다 :

select itemno, country, imgroup, imtariff, im.error "imerror", im.ok "imok", exgroup, extariff, ex.error "exerror", ex.ok "exok" 
from itemcountry 
    left outer join (select sum(case when icav.itemno is null then 1 else 0 end) error, sum(case when icav.itemno is not null then 1 else 0 end) ok, tariffgroup, tariffno 
        from itemattribute ia 
        left outer join icav on ia.attributeid=icav.attributeid 
        where (icav.itemno=12345 or icav.itemno is null) 
        group by tariffgroup, tariffno) im on im.tariffgroup=imgroup and imtariff=im.tariffno 
    left outer join (select sum(case when icav.itemno is null then 1 else 0 end) error, sum(case when icav.itemno is not null then 1 else 0 end) ok, tariffgroup, tariffno 
        from itemattribute ia 
        left outer join icav on ia.attributeid=icav.attributeid 
        where (icav.itemno=12345 or icav.itemno is null) 
        group by tariffgroup, tariffno) ex on ex.tariffgroup=exgroup and extariff=ex.tariffno 
where itemno=12345; 

그것은 또한 SQL Fiddle에서 설정합니다.

+0

당신은 선택할 수 없습니다. 무엇을 선택 하시겠습니까? 왼쪽 외부 조인 이외의 다른 솔루션이있을 수 있습니다. – hkutluay

+0

sqlfiddle 참조 – tedski

답변

0

하위 쿼리에서는 수행 할 수 있지만 조인에서는 수행 할 수 없습니다. 당신의 경우에 나는 어떤 필요성도 보이지 않습니다. 조인 조건에 넣을 수 있습니다.

select i.itemno, i.group 
    from item i 
    left outer join (select group, itemno 
         from attribute b 
        group by group itemno) a 
    on a.group = i.group 
    and i.itemno = a.itemno 
where i.itemno = 12345 

최적화 프로그램은 이런 종류의 상황을 처리하도록 설계되었습니다. 당신이 group by에 집계되지 않은 모든 열을 필요로하는

은 내가 group bycount(1)을 변경했습니다.

나는 실제 쿼리가 아마 당신은 또한 대신 analytic function와 하위 쿼리를 작성할 수

select itemno, group 
    from item 
where itemno = 12345 

에 equivilent되어 당신이 선택하고있는 열로 이것보다 더 복잡 있으리라 믿고있어. count(*) over (partition by group)과 같은 것입니다.

키워드를 열 이름으로 사용하는 경우를 제외하면이 경우 group은 잘못된 아이디어입니다. TM입니다. 그것은 많은 혼란을 야기 할 수 있습니다. 위의 코드에서 볼 수 있듯이 groups이 많이 있습니다.


그래서, 난 당신이 훨씬 더 보이지 않는 다음과 같은 뭔가를 찾고 있다고 생각 질문에 추가 한 당신의 SQL-바이올린을 기반으로.시간이 주어지면 나는 그것을 더 간단하게 만들 수 있다고 생각합니다. 명시 적으로 더 낮은 대소 문자를 구분하는 또 다른 쪽지에서는 그로 인해 발생하는 번거 로움을 해소 할 가치가 없습니다. 나는 당신의 명명 규칙을 따랐습니다.

with sub_query as (
select count(*) - count(icav.itemno) as error 
     , count(icav.itemno) as ok 
     , min(itemno) over() as itemno 
     , tariffgroup 
     , tariffno 
    from itemattribute ia 
    left outer join icav 
    on ia.attributeid = icav.attributeid 
    group by icav.itemno 
     , tariffgroup 
     , tariffno 
) 
    select ic.itemno, ic.country, ic.imgroup, ic.imtariff 
     , sum(im.error) as "imerror", sum(im.ok) as "imok" 
     , ic.exgroup, ic.extariff 
     , sum(ex.error) as "exerror", sum(ex.ok) as "exok" 
     from itemcountry ic 
     left outer join sub_query im 
     on ic.imgroup = im.tariffgroup 
     and ic.imtariff = im.tariffno 
     and ic.itemno = im.itemno 
     left outer join sub_query ex 
     on ic.exgroup = ex.tariffgroup 
     and ic.extariff = ex.tariffno 
     and ic.itemno = ex.itemno 
    where ic.itemno = 12345 
    group by ic.itemno, ic.country 
      , ic.imgroup, ic.imtariff 
      , ic.exgroup, ic.extariff 
      ; 
+0

감사합니다. 이러한 분석 기능을 살펴 보겠습니다. 네가 맞다. 가능한 한 간단하게 예제를 재 작성하려고했다. 내 최종 목표를보다 잘 표현하려면 편집에 추가 한 sqlfiddle에 있습니다. – tedski

+0

@tedski, 내 대답은 여전히 ​​있습니다! 덜 복잡한 예를 사용하는 것이 표준 관행이므로 모든 사람이 더 쉽게 삶을 사용할 수 있습니다. 당신은 여전히 ​​조인에 당신의 조건을 넣을 수 있습니다 ... – Ben

+0

죄송합니다, 내 예제는 올바르게 내 문제를 캡처하지 못했습니다. 하위 쿼리에는 다른 테이블이 조인되어 실제로 두 개의 카운트가 있습니다. 조인 된 테이블의 항목이 null 인 경우와없는 경우의 개수가 있습니다. 에 항목 번호를 추가하면 하나가 아닌 두 개의 열이 나옵니다. – tedski

-4

WHERE attribute.itemno = item.itemno를 부속 조회 내에 넣을 수 있습니다. 어쨌든 데이터를 필터링하려고합니다. 하위 쿼리 내부의 데이터를 필터링하는 것이 일반적으로 빠릅니다.

+0

... 마지막 단락을 읽을 수 없습니다. – tedski

+0

OP는 질문에서 이것이 작동하지 않는다고 표시했습니다. – Ben