반응형

 출처: http://blackbull.tistory.com/9

 

 

 

 

MySQL에서의 Sub Query의 더러운 진면목을 경험해 본 기억이 있기에,
(하루 온종일 돌려도 결과가 안 나와서 걷어찰 뻔 했다는...-_-;;)
요즘 모든 Sub Query들을 JOIN을 이용하여 해결하기 위해 노력한다.

그런데!!! 두둥!!
이런 뒌장.... 평소에 잘 돌아가던 코드가 Oracle에서는 안 돌아가더라....
'!$!@%$%!#$ㅆㄲㄸㅎㄹㅇㅎ!#!@#' 라고 욕을 잔뜩 하고 난 다음..
고민이 들더라..

많은 양의 데이터를 Migration 하기 위해 미리 짜 놓은 Query가,
쓰레기가 되는 상황이 벌어졌으니....
'뭐.. 아직은 시간이 남았으니 해결책을 마련해 보자.'
라고 하다가,

언제나처럼, 내 옆에 계시는 '고수'님의 파워를  빌어 내었다..

물론, 설명을 듣고 난 후에 오라클을 향해 다시 한 번
'*@$@#$@ㅎㅎㄲㄸㅎㅃㅎㄸㄲㅎ#$!$'
라고 해주는 것 또한 잊지 않았다눙~~

아.. 그런데 욕하다 보니 생각났다....
'내가 무식한 거구나 --;; !$%!$#%#$#!@#ㅇㅀㄶㄸ'

뭐 각설하고, 본론으로 가보장.

********************************************************************
[MySQL 에서의 사용 예]
UPDATE table_a a INNER JOIN table_b b ON (a.id = b.id)
SET       a.value = 'MySQL이 아직 공짜라 좋다!!'
WHERE  a.check_point = 'N';
********************************************************************
요럴 경우, 우리의 훌륭한 MySQL은 별다르게 다른 작업을 해주지 않아도,
참 일을 잘해준다.
즉, 쪼인을 건 상태임에도 불구하고, 알아서 해당 테이블의 값을 잘 넣어준다는 말씀.

그런데, 오라클을 함 보장.
********************************************************************
[Oracle 에서의 사용 예]
UPDATE table_a a INNER JOIN table_b b ON (a.t_id = b.t_id)
SET       a.t_value = 'Oracle 아따따 뿌우겐!!'
WHERE  a.t_check_point = 'N';
********************************************************************
요러면... 에러난다..
왜? UPDATE 구문에 들어갈 녀석의 JOIN이 되지 않기 때문이다.
Oracle 曰... 'SET 어딨냐?' --;;

그럼... 일보 후퇴하여, 궁극 병기 서브쿼리의 형식으로 쥐어짜 보자.
********************************************************************
[Oracle 에서의 사용 예]
UPDATE (SELECT a.t_value, a.t_check_point
             FROM table_a a INNER JOIN table_b b ON (a.t_id = b.t_id)
             ) x
SET       x.t_value = 'Oracle 아따따 뿌우겐!!'
WHERE  x.t_check_point = 'N';
********************************************************************
쓰읍... 결과는?  당근 된다..

그럼 한 가지 더...

저번에 오라클 10g AdminWorkshop 과정 때 강사님께,
'혹시 위와 같은 상황에서, 실제로 업데이트가 가능한 컬럼들을 알 수 있을까요?'
라고 여쭈어보니, 하루 있다 말씀 주신 것이...

'오라클에는 ALL_UPDATABLE_COLUMNS, USER_UPDATABLE_COLUMNS 라는 테이블이 있다.'

ALL_UPDATABLE_COLUMNS는 생성된 VIEW의 속성값 변경 가능 여부를
표시하는 시스템 테이블이고, USER_UPDATABLE_COLUMNS는 유저에게 종속된 VIEW의
속성 변경 가능 여부를 표시해준다.


하지만, 저것만으로는 매번 뷰를 생성해서 확인해 봐야 하는 중노동(?)이 필요하다.
뭔가 다른 방법은 없을까?

http://download.oracle.com/docs/cd/B28359_01/server.111/b28310/views001.htm#i1006232

상기 링크를 보면, Updatable Join View 가 되기 위해서는 반드시 해당 View가
Key-preserved Table이여야 하다고 한다.

흠... 그거만 있으면 되는건가?




반응형
반응형

출처: http://warmz.tistory.com/276

 

JOIN (조인) 연산자
 - 두개 이상의 테이블을 연결하여 데이터를 검색할때 사용한다.
 - 데이터베이스 시스템과 그 환경의 성능을 확인하는데도 사용할 수 있다. (느린 쿼리를 사용하여 비교)
 - 조인에는 여러가지 종류가 있다.

 

 조인 종류  설명 
 내부조인(INNER JOIN)  조건을 사용해서 두 테이블의 레코드를 결합한다.
 외부조인(OUTER JOIN)  내부조인과 비슷한데 일치하지 않는 열까지 반환하며 그 열은 NULL로 반환한다.
 동등 조인(EQUI JOIN)  내부조인이다. 두 테이블 사이의 같은 행들을 반환한다.
 비동등 조인(NON-EQUI JOIN)  내부조인이다. 두 테이블 사이의 같지 않은 행들을 반환한다.
 자연 조인(NATURAL JOIN)  'ON' 절이 없는 내부조인. 같은 열 이름을 가진 두 테이블을 조인할때만 작동
 크로스 조인(CROSS JOIN)  한 테이블의 모든 행과 다른 테이블의 모든 행이 연결되는 모든 경우를 반환.
 카티젼 조인(CARTESIAN JOIN)  크로스 조인의 한 종류. 조건이 없다. (크로스 프로덕트)
 콤마 조인(COMMA JOIN)  콤마가 CROSS JOIN 키워드 대신 사용된다는 점을 제외하면 크로스 조인과 같다.
 셀프 조인(SELF JOIN)  자기 자신을 조인한다.

 



1. 내부 조인(INNER JOIN)
 - 조건을 사용하여 두 테이블의 레코드를 결합한다.
 - 동등 조인, 비동등 조인, 자연 조인 등이 있다.

 

1
2
3
4
Select somecolumns From table1          -- 반환되는 열
                Inner Join                    
                table2
                ON somecondition;   -- ON 또는 WHERE 조건절

 

 


 
 1) 동등 조인(EQUI JOIN)
      - 두 테이블 사이의 같은 행들을 반환한다.

 예) 각 boy가 어떤 toy를 가지고 있는지 조사한다. (매핑 확인)

 

1
2
3
Select boys.boy, toys.toy
From boys INNER JOIN toys
ON boys.toy_id = toys.toy_id;

 

 

 


  
 2) 비동등 조인(NON-EQUI JOIN)
     -두 테이블 사이의 같지 않은 모든 행들을 반환한다.
 
 예)

 

1
2
3
4
Select boys.boy, toys.toy
From boys INNER JOIN toys
ON boys.toy_id <> toys.toy_id -- <> :  같지 않음
ORDER BY boys.boy;          -- 정렬

 

 



 3) 자연 조인(NATURAL JOIN)
     - 두 테이블에 같은 이름의 열이 있을때만 동작한다.
     - ON이 필요없다.

  예) 

 

1
2
Select boys.boy, toys.toy
From boys NATURAL JOIN toys;

 

 

 

 


2. 외부 조인(OUTER JOIN)
  - 내부 조인과 유사하며 일치하는 것이 없을 경우 NULL로 표시한다.
  - 왼쪽 테이블은 FROM 바로 다음에 나오는 테이블이고, JOIN 뒤에 나오는 테이블이 오른쪽 테이블이다.
  - 왼쪽 외부 조인(LEFT OUTER JOIN)과 오른쪽 외부 조인(RIGHT OUTER JOIN)이 있다.
  - 왼쪽 외부 조인을 사용할 경우 왼쪽 테이블을 오른쪽 테이블에 비교한다. 오른쪽 외부 조인도 그 반대로 동작한다. 일대다 관계에 유용하다.

 유용한 예) girls가 어느 toys를 가지고 있는지 알아보도록 쿼리를 작성한다.

  i) 왼쪽 테이블을 오른쪽 테이블에 비교하는 방법 

 

1
2
3
Select g.girl, t.toy From girls g
Left Outer Join toys t
ON g.toy_id = t.toy_id;

 

 

 


  ii) 반대로 했을때

 

1
2
3
Select g.girl, t.toy From toys t
Left Outer Join girls g
ON g.toy_id = t.toy_id;

 

 

 


  
 
3. 크로스 조인(CROSS JOIN)
  - 한 테이블의 모든 행과 다른 테이블의 모든 행을 짝지워 반환한다.
  - 카티전 조인, 카티전 프로덕트 등이 있다.

 예)

 

1
2
Select t.toy, b.boy
From toys AS t CROSS JOIN boys AS b;

 

 




4. 셀프 조인(SELF JOIN)
  - 자기 자신을 조인한다.
  - 자기 자신을 하나씩 비교하기 위해 사용한다.
  - 하나의 테이블로 같은 정보를 가진 테이블이 두 개 있는 것처럼 쿼리를 보낼 수 있다.

  예) 각 사람의 이름(name)과 그 사람을 담당하는 보스(boss)의 이름을 가져온다. 

 


 

 

1
2
3
4
Select c1.name, c2.name AS boss
From clown_info c1
Inner Join clown_info c2
ON c1.boss_id = c2.id;

 

 

 

반응형
반응형

 

APTlevel DB에 있는 IPSlevel 테이블을 app_log DB에 IPSlevel로 옮길 경우

반응형
반응형

 

select * from [테이블] order by [정렬할 속성]desc limit [출력 갯수]

 

 

반응형

+ Recent posts