2017-12-14 5 views
1

여기에 세 개의 다른 열로 배포 할 하나의 하위 쿼리에 동일한 테이블에서 세 가지 다른 하위 쿼리를 변환하려고합니다.같은 테이블에서 하나의 쿼리로 여러 하위 쿼리를 변환

가능합니까?

PI_NO || con_date(45) || subjvis(46) || initDate(47) 
---------------------------------------- 
1234 || 14-DEC-2017 || 12-DEC-2017||15-DEC-2017  

이 오라클

에서 달성 될 수 : 내 실제 쿼리는

select p.pi_no,(SELECT pu_DATE 
       FROM tabl1 
       WHERE pi_no = p.pi_no 
        AND si_no = 45 
       ) AS con_date, 
       (SELECT pu_DATE 
       FROM tabl1 
       WHERE pi_no = p.pi_no 
        AND si_no  = 46 
       ) AS subjvis, 
       (SELECT pu_DATE 
       FROM tabl1 
       WHERE pi_no = p.pi_no 
        AND event_no  = 47 
       ) AS initDate 
from public p; 

출력을 원하는

select tu.pi_no, (SELECT pu_DATE 
        FROM tabl1 
        WHERE pi_no = tu.pi_no 
        AND si_no IN(45,46,47) 
       ) 
from public tu; 

이 같이하고자로 변환 할 ---입니다

+0

당신이'public'와'tabl1' 테이블에 가입하려고 : 여기

솔루션입니까? 그렇다면 가입 할 필드는 무엇입니까? – Vashi

+0

@Vashi'pi_no = p.pi_no'를 기반으로 조인하려고합니다. PI_NO는 public과 tabl1에서 사용할 수 있습니다. –

+0

이 마지막 스칼라 질의에는 'AND event_no = 47' 조건이 있습니다. 이건 ', 그리고 si_no = 47'이 될 예정입니까? –

답변

1

하위 조인을 조인으로 바꿉니다

SELECT 
    tu.pi_no, 
    t1.pu_date AS con_date, 
    t2.pu_date AS subjvis, 
    t3.pu_date AS initDate 
FROM 
    public tu 
    LEFT JOIN tabl1 t1 ON tu.pi_no = t1.pi_no AND t1.si_no = 45 
    LEFT JOIN tabl1 t2 ON tu.pi_no = t2.pi_no AND t2.si_no = 46 
    LEFT JOIN tabl1 t3 ON tu.pi_no = t3.pi_no AND t3.si_no = 47 

선택 목록의 하위 쿼리에서 둘 이상의 열을 반환 할 수 없습니다.

0

pi_no 필드에 가입하는 경우 아래의 조인이 작동해야합니다. 주어진 pi_no에 대해 si_no의 특정 값이 45라고 표시되지 않으면 NULL이 채워집니다. 시도 :

SELECT tu.pi_no, 
CASE WHEN a.si_no = 45 THEN a.pu_DATE ELSE NULL END AS con_date, 
CASE WHEN a.si_no = 46 THEN a.pu_DATE ELSE NULL END AS subjvis, 
CASE WHEN a.si_no = 47 THEN a.pu_DATE ELSE NULL END AS initDate 
FROM 
PUBLIC tu 
LEFT JOIN 
tabl1 a 
ON tu.pi_no = a.pi_no; 
+0

'tabl1'은'public'보다 많은 기록을 가지고 있습니다. 너무 많은 레코드가 생성됩니다. –

+0

설명을 기반으로하는 관계 유형 (일대 다, 일대일 등)에 대해서는 명확하지 않습니다. 두 테이블 중 어느 것이'pi_no'를 표시하고 싶습니까? 주 테이블. – Vashi

+0

OP는'si_no = 45','si_no = 46' 및'si_no = 47'를 쿼리하므로'public'에'pi_no' 당 적어도 세 개의 레코드가 있어야합니다. 나는. 최소한 3 개의 컬럼 중 2 개가 NULL 인 경우에만 조회가 작동합니다. 그리고 'si_no = 50'와 같은 것이 더 많을 수 있습니다. –

1

를 사용하여 조건부 논리를 집계 함수, MAX로, 테이블의 입상으로 스칼라 하위 쿼리 값을 구하는, PUBLIC

을 목표는 개체의 모든 레코드를 반환하는 것입니다, public (이 이름은 keyword이기 때문에 이상적이지 않습니다). 객체의 추정 키 PUBLICpi_no이므로이 열을 group by 절에 넣으면 쿼리의 세분성이 동일하게 유지됩니다.

값이있는 레코드를 얻으려면 조건부 논리의 최대 값을 취합니다 (tabl1의 키가 pi_no, si_no 인 것으로 가정).

SELECT 
    p.pi_no, 
    MAX(DECODE(si_no,45,t.pu_date,TO_DATE(NULL))) con_date, 
    MAX(DECODE(si_no,46,t.pu_date,TO_DATE(NULL))) subjvis, 
    MAX(DECODE(si_no,47,t.pu_date,TO_DATE(NULL))) initdate 
FROM 
    public p 
    LEFT OUTER JOIN tabl1 t ON pi_no = p.pi_no 
           AND si_no IN (45, 46, 37) 
GROUP BY 
    p.pi_no;