2016-06-29 2 views
0

유니온을 사용하지 않고 다음 데이터를 가져올 수있는 다른 방법이 있습니까?Oracle의 유니온 대체품

select A.name,A.age,B.Address,C.phoneNo from table1 A,Table2 B,Table3 C where a.pkId = b.FkId and b.pkId = c.FkId 
union 
select A.name,A.age,B.Address,C.phoneNo from table4 A,Table5 B,Table3 C where a.pkId = b.FkId and b.pkId = c.FkId 

나는 이것을 최대 절전 모드에서 사용하고 있으며, 불행하게도 최대 절전 모드는 지원하지 않는다. 난 다른 방법으로 그것을 달성하는 다른 방법이 있다면 그것은 병에 프로 시저에서 작성하고 임시 테이블에 데이터를 저장하고 해당 임시 테이블에서 데이터를 읽을 SQL을 해고

+1

왜 'union'을 사용하고 싶지 않은지 설명 할 수 있습니까? –

+0

'UNION ALL'은 아마도 여기에 더 좋을까요? – jarlh

+0

사실 나는 이것을 Hibernate에서 사용하고 있으며 불행하게도 최대 절전 모드에서는 Union을 지원하지 않는다. 난 다른 방법을 그것을 다른 사람이 그것을 프로 시저에 쓰기 및 temp 테이블에 데이터를 저장하고 해당 임시 테이블에서 데이터를 읽을 수있는 SQL 화재 야하는 다른 방법이 궁금 해서요 – user2093576

답변

1

union에 대한 대안이 있습니다 하지만 꽤되지 않습니다 :

select distinct coalesce(x1.name, x2.name) as name, 
     coalesce(x1.age, x2.age) as age, 
     coalesce(x1.Address, x2.Address) as age, 
     coalesce(x1.phoneNo, x2.phoneNo) as age, 
from (select A.name, A.age, B.Address, C.phoneNo 
     from table1 A join 
      Table2 B 
      on a.pkId = b.FkId join 
      Table3 C 
      on b.pkId = c.FkId 
    ) x1 full outer join 
    (select A.name, A.age, B.Address, C.phoneNo 
     from table4 A join 
      Table5 B 
      on a.pkId = b.FkId join 
      Table3 C 
      on b.pkId = c.FkId 
    ) x2 
    on 1 = 0; -- always false 

이 같은 union을 표현하고자하는 이유를 나는 상상할 수 없다. 그래도 적절하고 명시적인 join 구문을 사용하기 시작하는 것이 좋습니다.

0

이 작업은 무엇입니까?

SELECT 
    CASE DISTINCT_FLG WHEN 1 THEN nameA ELSE nameB END name, 
    CASE DISTINCT_FLG WHEN 1 THEN ageA ELSE ageB END age, 
    CASE DISTINCT_FLG WHEN 1 THEN AddressA ELSE AddressB END Address, 
    CASE DISTINCT_FLG WHEN 1 THEN phoneNoA ELSE phoneNoB END phoneNo 
FROM (
    SELECT 
     T1.name AS nameA, T1.age AS ageA, T2.Address AS AddressA, T3.phoneNo AS phoneNoA, 
     T4.name AS nameB, T4.age AS ageB, T5.Address AS AddressB, T3.phoneNo AS phoneNoB, 
     ROW_NUMBER() OVER(PARTITION BY T1.name, T1.age, T2.Address, T4.name, T4.age, T5.Address, T3.phoneNo ORDER BY NULL) AS DISTINCT_FLG 
    FROM 
     table1 T1, 
     table2 T2, 
     table4 T4, 
     table5 T5, 
     table3 T3 
    WHERE 
     T1.pkId = T2.FkId AND 
     T4.pkId = T5.FkId AND 
     (
      T2.pkId = T3.FkId OR 
      T5.pkId = T3.FkId 
     ) 
) WHERE DISTINCT_FLG IN (1, 2) 
0

그 두 UNION 부품 공통점 Table3 C, 그래서 우리는 나머지를 가입 할 수 있습니다. 소스 테이블에서 UNION 기록을 에뮬레이션하기 위해 필요한 수의 또는 행과 보조 테이블을 조인 무조건적인 크로스를 통해 복제 할 수 있습니다 :

Select Distinct 
    CASE R.r WHEN 1 THEN A1.name ELSE A2.name END As name , 
    CASE R.r WHEN 1 THEN A1.age  ELSE A2.age  END As age , 
    CASE R.r WHEN 1 THEN B1.Address ELSE B2.Address END As Address, 
    C.phoneNo 
From Table3 C,           --< Start at common Table3 
    (Select Rownum r From USER_TABLES Where Rownum < 3) R --< Two rows to replicate Table3 C 
-- Any table with more than one row will do 
-- USER_TABLES should have enough rows in this particular case 
Left Join Table2 B1 On R.r = 1 AND B1.pkId = C.FkId  --< Left Join branch one 
Left Join table1 A1 On R.r = 1 AND A1.pkId = B1.FkId 
Left Join Table5 B2 On R.r = 2 AND B2.pkId = C.FkId  --< Left Join branch two 
Left Join table4 A2 On R.r = 2 AND A2.pkId = B2.FkId 
Where (R.r = 1 AND A1.pkId Is NOT NULL)     --/ Make sure we have values 
    OR (R.r = 2 AND A2.pkId Is NOT NULL)     --\ for the branch 

을하지만, 정말로 view을 고려하십시오.