레이블이 외부조인인 게시물을 표시합니다. 모든 게시물 표시
레이블이 외부조인인 게시물을 표시합니다. 모든 게시물 표시

2022년 2월 11일 금요일

C#교육동영상, LINQ 내부조인, 외부조인 내부 JOIN을 메서드 기반으로, C#교육, 자바교육, WPF교육, 자바학원, 스프링교육, JAVA학원, JAVA동영상, 시샵동영상

 C#교육동영상,  LINQ 내부조인, 외부조인  내부 JOIN을 메서드 기반으로, C#교육, 자바교육, WPF교육, 자바학원, 스프링교육, JAVA학원, JAVA동영상, 시샵동영상


http://ojc.asia/bbs/board.php?bo_table=LecCsharp&wr_id=418 


C# LINQ 내부조인, 외부조인 내부 JOIN을 메서드 기반으로

C# LINQ 내부조인, 외부조인 내부 JOIN을 메서드 기반으로LINQ내부조인, 외부조인내부 JOIN을 메서드 기반으로C# LINQ 조인(Join)조인은 두 데이터 소스에서 조인키를 기준으로 일치하는지 비교하여 새

ojc.asia


https://www.youtube.com/watch?v=DaekIbRnM_w&list=PLxU-iZCqT52DJyR6gqJy0MCL8RiTVXdos&index=24
 

LINQ

내부조인, 외부조인

내부 JOIN을 메서드 기반으로






C# LINQ 조인(Join)


조인은 두 데이터 소스에서 조인키를 기준으로 일치하는지 비교하여 새로운 데이터 셋을 만들어 내는 것이다.




1. 내부조인 


내부조인은 교집합과 비슷하며 첫 번째 데이터원본의 특정 필드와 두 번째 데이터원본의 특정 필드를 비교하여 일치하는 데이터만 반환한다. SQL의 Inner Join과 유사하다.


[형식]


from a in 고객

join b in 매출 on a.이름 equals b.이름 

select a


on절의 조인조건은 동등비교(equals)만 가능하다.

조건에 정확히 일치하지 않는 데이터는 빠진다.


2. 외부조인


LINQ는 외부조인 중 왼쪽조인(Left Outer Join)만 지원한다. 먼저 조인절을 이용하여 조인수행 후

결과를 임시 컬렉션에 저장하고 이 임시컬렉션에 대해 DefaultIfEmpty 연산을 수행해서 비어있는 조인결과에 빈 값을 채운다. DefaultIfEmpty 연산을 거친 임시 컬렉션에서 from 절을 통해 변수를 뽑아내고 비 범위변수와 기준데이터 원본에서 뽑아낸 범위변수를 이용하여 결과를 추출한다.


namespace LinkJoin

{

    class Customer

    {

        public string Name { get; set; }

        public int Age { get; set; }

    }


    class Sale

    {

        public string Name { get; set; }

        public string Product { get; set; }

    }


    class Test

    {

        static void Main(string[] args)

        {

            Customer[] customer = {

                new Customer() {Name="홍길동", Age=8},

                new Customer() {Name="김길동",  Age=6},

                new Customer() {Name="오자커",  Age=13}

            };


            Sale[] sale = {

                new Sale() {Name="홍길동", Product="볼펜"},

                new Sale() {Name="김길동", Product="연필"},

            };


            // 고객별 매출현황을 출력

            // 내부조인("오자커"는 매출내역이 없으므로 출력되지 않는다)

            var result1 = from c in customer

                              join s in sale on c.Name equals s.Name

                             select new

                             {

                                Name = c.Name,

                                Age = c.Age,

                                 Product = s.Product

                             };


            foreach (var x in result1)  Console.WriteLine("이름 : {0}, 나이 : {1}, 상품 : {2}", x.Name, x.Age, x.Product);


            //외부조인

            result1 = from c in customer

                         join s in sale on c.Name equals s.Name into tmp

                         from s in tmp.DefaultIfEmpty(new Sale() { Product = "제품없음" })

                         select new

                         {

                             Name = c.Name,

                             Age = c.Age,

                             Product = s.Product

                         };


            Console.WriteLine("------------------------------------------------");

            foreach (var x in result1)

            {

                Console.WriteLine("이름 : {0}, 나이 : {1}, 제품 : {2}", x.Name, x.Age, x.Product);

            }


            // 내부JOIN을 메소드 쿼리식

            int[] arr1 = { 5, 6, 7};

            int[] arr2 = { 6, 7, 10 };


            Console.WriteLine("\n------------------------------------------------");

            // 메소드 기반 쿼리식

            //arr1의 수를 1증가 한값이 arr2와 같은 arr1의 값을 출력

            var res1 = arr1.Join<int, int, int, int>(arr2,

                                                       x => x + 1,   //outer key selector, 조인조건

                                                       y => y,         //inner key selector, 조인조건

                                                       (x, y) => x);   //결과 : 조인을 만족하는 X값을 출력

            foreach (var r in res1) Console.Write(r + " ");


            Console.WriteLine("\n------------------------------------------------");

            //쿼리식 기반

            //arr1의 수를 1증가 한값이 arr2와 같은 arr1의 값을 출력

            var res2 = from x in arr1

                           join y in arr2 on (x + 1) equals y

                          select x;


            foreach (var r in res2) Console.Write(r + " ");

            Console.WriteLine("\n------------------------------------------------");

        }

    }

}




[결과]

이름 : 홍길동, 나이 : 8, 상품 : 볼펜

이름 : 김길동, 나이 : 6, 상품 : 연필

------------------------------------------------

이름 : 홍길동, 나이 : 8, 제품 : 볼펜

이름 : 김길동, 나이 : 6, 제품 : 연필

이름 : 오자커, 나이 : 13, 제품 : 상품없음


-------------

5 6

-------------

5 6

-------------



#LINQ, #내부조인, #외부조인, #LINQJOIN, #LINQ조인, #시샵교육, #시샵동영상, #닷넷교육, #닷넷동영상, #시샵학원, #닷넷학원, LINQ, 내부조인, 외부조인, LINQJOIN, LINQ조인, 시샵교육, 시샵동영상, 닷넷교육, 닷넷동영상, 시샵학원, 닷넷학원,  

2021년 12월 10일 금요일

오라클 SQL 조인(Oracle SQL Join), 내부조인(Inner Join)과 외부조인(Outer Join), ANSI SQL 조인방식비교, SQL학원, 오라클학원, SQL동영상

 

오라클 SQL 조인(Oracle SQL Join), 내부조인(Inner Join)과 외부조인(Outer Join), ANSI SQL 조인방식비교, SQL학원, 오라클학원, SQL동영상


http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=702 


오라클 SQL 조인(Oracle SQL Join), 내부조인(Inner Join)과 외부조인(Outer Join), ANSI SQL 조인방식비교

오라클 SQL 조인(Oracle SQL Join), 내부조인(Inner Join)과 외부조인(Outer Join), ANSI SQL 조인방식비교오라클 조인내부조인(Inner Join) vs 외부조인(Outer Join)오라클 조인방식(+)과 ANSI SQL 조인방식의 비교실습 :

ojc.asia

https://youtu.be/LEEyBd4n_50

 

https://www.youtube.com/watch?v=XsnDCri9A-A&list=PLxU-iZCqT52Dlz0zGgFiq1mBz21arFUHS&index=9 


오라클 조인



내부조인(Inner Join) vs 외부조인(Outer Join)

오라클 조인방식(+)과 ANSI SQL 조인방식의 비교



실습 : 오라클 19C



ANSI SQL은 모든 DB에 공용으로 사용할 수 있는 SQL 표준으로 테이블 조인관계는 FROM ~ ON ~ 에서 기술하고 WHERE절에서는 데이터를 필터링 하는 조건만 기술하므로 SQL구문의 가독성이 좋습니다. 


  1. 조인이란?


연관된 둘 이상의 테이블에 대해 행들을 컬럼값을 기준으로 비교하여 새로운 행 집합을 만드는 것으로 각 테이블 간 의미있는 행을 연결하는 개념입니다. 


  1. 조인의 4가지 유형


내부 조인, 완전 외부 조인, 왼쪽 외부 조인 및 오른쪽 외부 조인.


  1. 내부조인(Inner Join)


내부 조인은 두 테이블의 교집합을 추출합니다. 양쪽 테이블에서 정확히 조인조건을 만족하는 행들이 추출되는 일반적인 조인 방식 입니다.



실습


EMP, DEPT 테이블 전체를 조인하여 모든 사원의 사원번호, 사원명, 부서명을 출력하세요.

(부서명을 가져오기 위해 DEPT 테이블과 DEPTNO로 조인을 합니다. 사원테이블에서 부서번호가 없는 KING 사원은 출력되지 않습니다.)


사원 테이블과 부서테이블의 데이터를 확인 합니다.


SELECT empno, ename, deptno
FROM emp


<실행결과>



empno
ename
deptno
1
7369
SMITH
20
2
7499
ALLEN
30
3
7521
WARD
30
4
7566
JONES
20
5
7654
MARTIN
30
6
7698
BLAKE
30
7
7782
CLARK
10
8
7788
SCOTT
20
9
7839
KING


10
7844
TURNER
30
11
7876
ADAMS
20
12
7900
JAMES
30
13
7902
FORD
20
14
7934
MILLER
10


부서 테이블(DEPT)의 데이터 입니다.


SELECT *
FROM    dept


<실행결과>



deptno
dname
loc
1
10
ACCOUNTING
NEW YORK
2
20
RESEARCH
DALLAS
3
30
SALES
CHICAGO
4
40
OPERATIONS
BOSTON


a. ANSI SQL 조인형식


SELECT  E.EMPNO, E.ENAME, D.DNAME
FROM     EMP E INNER JOIN DEPT D
ON          E.DEPTNO = D.DEPTNO;


b. 일반적인 조인(모든 DB에서 사용가능)


SELECT E.EMPNO, E.ENAME, D.DNAME
FROM     EMP E , DEPT D
WHERE  E.DEPTNO = D.DEPTNO;



  1. 외부조인(Outer Join)


외부조인은 한 테이블에서 모든 값을 가져오지만 다른 테이블에서 해당 테이블과 일치하는 행만 가져오려는 경우에 이용합니다. 왼쪽 외부 조인에서는 왼쪽 테이블의 모든 행과 오른쪽 테이블의 공통 행이 반환됩니다. 반대로, 오른쪽 외부 조인의 경우 오른쪽 테이블의 모든 행과 왼쪽 테이블의 공통 행이 반환됩니다.


  1. 왼쪽 외부 조인(Left Outer Join)


EMP, DEPT 테이블 전체를 조인하여 모든 사원의 사원번호, 사원명, 부서명을 출력하세요.

(EMP 테이블에서 부서코드가 없는 KING도 출력 됩니다.)

– ANSI SQL 조인형식
SELECT E.EMPNO, E.ENAME, D.DNAME
FROM   EMP E LEFT OUTER JOIN DEPT D       
ON     E.DEPTNO = D.DEPTNO;


– 오라클 조인 형식
SELECT E.EMPNO, E.ENAME, D.DNAME
FROM   EMP E , DEPT D
WHERE  E.DEPTNO = D.DEPTNO(+);


그렇다면 2가지 방식의 차이는 무엇일까요?


ANSI SQL 조인 구문에서는 조인조건은 ON 다음에, 데이터를 필터링 하기 위한 조건은 WHERE절에 기술하여 가독성이 좋습니다. 하지만 오라클 조인구문은 WHERE절에 조인조건과 데이터를 필터링하는 조건들을 같이 기술하여 이들의 순서가 잘 안지켜지고 SQL문이 복잡한 경우에는 가독성이 떨어지고 잘못된 결과를 도출할 확률이 높습니다. WHERE절의 기본 용도는 데이터를 필터링 한다는 관점에서 본다면 ANSI 조인구문을 사용하는 것이 바람직 합니다. 또한 ANSI 조인 방식은 어떤 DataBase에도 통용되는 방식 입니다.


물론 위 실습과 같은 내부조인의 경우 두가지 방식 모두 어떤 데이터베이스에서 SQL문을 작성하던지 동일하게 사용가능 하지만 외부조인의 경우 ANSI SQL 조인구문만 공용으로 사용가능하며 오라클 조인 구문은(+) 오라클 DB에서만 사용 가능합니다.


b. 오른쪽 외부 조인(Right Outer Join)



부서이름별 사원수를 조회 합니다. 외부조인을사용하지 않은 경우와 외부 조인을 사용한 경우를 비교하여 실습 합니다.


-- 외부조인을 사용하지 않은 경우, EMP 테이블에 부서원들이 하나도 없는 OPERATIONS 
-- 부서는 출력되지 않습니다.
SELECT DNAME
      , COUNT(E.EMPNO)  AS EMP_CNT
FROM  EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
GROUP BY DNAME;


-- 외부조인을 이용(ANSI SQL 조인방식)
SELECT DNAME
      , COUNT(E.EMPNO)  AS EMP_CNT
FROM  EMP E RIGHT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
GROUP BY DNAME;


-- 외부조인을 이용(오라클 조인방식)
SELECT DNAME
      , COUNT(E.EMPNO)  AS EMP_CNT
FROM  EMP E, DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO
GROUP BY DNAME;



c. 전체 외부 조인(Full Outer Join)


조인조건을 만족하지 않는 왼쪽 테이블의 모든 행과 오른쪽 테이블의 모든 행이 반환됩니다.


EMP, DEPT 테이블을 조인하여 사원이름과 부서명을 출력하는데 아래 조건을 만족하도록 작성을 해보겠습니다.


  1. 부서가 없는 KING도 출력 
  2. 부서원이 없는 40번부서도 출력


즉 조인 조건이 맞지 않더라도 부서도 다 출력해야 하고 사원도 다 출력해야 하는 쿼리를 만들어야 하는데요, 이 경우에는 전체 외부조인(FULL OUTER JOIN)을 사용해야 합니다.


[ANSI SQL 조인방식]

SELECT ename
             , dname 
FROM    emp FULL OUTER JOIN dept
ON         emp.deptno = dept.deptno


[오라클 조인방식은 지원하지 않습니다.]

SELECT ename
             , dname 
FROM    emp , dept
WHERE  emp.deptno(+) = dept.deptno(+)   


⇐ 오류!! ORA-01468: outer-join된 테이블은 1개만 지정할 수 있습니다


 

#SQL조인, #오라클조인, #조인이란, #JOIN이란, #내부조인, #외부조인, #INNERJOIN, #OUTERJOIN, #오라클교육, #SQL교육, #오라클학원, #SQL학원, #SQL동영상, #오라클동영상, SQL조인, 오라클조인, 조인이란, JOIN이란, 내부조인, 외부조인, INNERJOIN, OUTERJOIN, 오라클교육, SQL교육, 오라클학원, SQL학원, SQL동영상, 오라클동영상



2020년 7월 19일 일요일

오라클 SQL조인, 외부조인, OUTER JOIN

오라클 SQL조인, 외부조인, OUTER JOIN

http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=623

6.5 Outer Join

일반적인 조인(내부조인)은 두 테이블 모두 조인 조건을 만족시키는 레코드만 출력된다. 즉 두 테이블중 한쪽 테이블의 값이 일치하지 않는 다면 해당 레코드는 출력되지 않는데 이 경우에도 결과로 출력해야 되는 경우가 있다면 외부조인(Outer Join)을 사용하면 된다. 외부조인은 LEFT OUTER JOIN, RIGTH OUTER JOIN, FULL OUTER JOIN이 있다.

EMP, DEPT를 조인하여 사원명(ename)과 부서명(dname)을 출력한다고 했을 때 EMP 테이블의 KING은 최고관리자로 부서코드가 NULL 값이다. 이 경우 emp.deptno = dept.deptno 로 조인을 한다면 KING은 출력되지 않는다.

내부 조인은 조인 조건을 만족하는 행들만 나타나게 된다. 그러므로 앞의 Self Join 예문처럼 조인 조건을 만족하지 않는다면(NULL 값을 가지는 경우) 해당 레코드는 출력되지 않을 것이다. Outer Join이란 조인에서 한쪽 테이블의 행에 대하여 다른 쪽 테이블에 일치하는 행이 없더라도 다른 쪽 행을 NULL로 하여 행을 반환하게 하는 것이다.

오라클에서 Outer Join 연산자는 “(+)”이며 MS의 SQL Server의 경우는 “*” 이다. 그럼 “(+)”를 조인되는 테이블 중 어디에다 둘 것 인가 이다. 오라클의 경우 모두 출력 되어야 하는 테이블의 반대쪽, 조인될 데이터가 없는쪽에 “(+)”를 표시하며 SQL Server의 경우 모두 출력 되어야 하는 곳 쪽에 “*”를 표시 한다. 모두 출력되어야 한다는 것의 의미는 조인 조건을 만족하지 않다고 해도 해당 레코드를 표시한다는 것을 의미하며, 조인되는 테이블의 해당 칼럼은 NULL로 표시된다.

앞의 Self Join 예문에서 사원 별 관리자 이름을 출력하는데 1번 사원의 레코드가 출력되지 않았던 것을 기억 할 것이다. 이 경우 어디에 “(+)”를 하여야 할까? 사원 쪽이 다 출력 되어야 한다. 즉 관리자가 있든지, 없든지 사원 리스트의 모든 사원은 나와야 하는 것이다. 그렇다면 관리자 쪽에 (+) 표시를 하면 될 것이다. 다음과 같이 SQL문을 수정하면 된다. 마지막에 (+)만 추가 되었다.

SQL> select "사원".sawon_id "사원ID",

2 "사원".name "사원명",

3 "사원".buseo "부서명",

4 "관리자".name "관리자명"

5 from sawon "사원", sawon "관리자"

6 where "사원".manager_id = "관리자".sawon_id(+);

사원ID 사원명 부서명 관리자명

---------- ---------- -------------------- ----------

1 가길동 관리부

2 나길동 영업부 가길동

3 다길동 관리부 가길동

또는 아래와 같이 표현해도 된다. 아래의 표기는 ANSI 표준에 부합 하므로 MS SQL Server, MySQL 등에서 똑같이 사용해도 무방 하다. 아래에서 유심히 볼 부분은 from 절 다음 부분이다. left outer join 이라고 한 것은 왼쪽 부분인 “사원” 테이블의 내용은 조인에 맞지 않더라도 관리자이름은 NULL을 채우면서 다 출력 되어야 한다는 것이다. left의 반대인 right Outer Join도 있다. 그러나 의미는 같은 것이니 예문을 통해 이해 하기 바란다.

SQL> select "사원".sawon_id "사원ID",

2 "사원".name "사원명",

3 "사원".buseo "부서명",

4 "관리자".name "관리자명"

5 from sawon "사원" left outer join sawon "관리자"

6 on "사원".manager_id = "관리자".sawon_id;

사원ID 사원명 부서명 관리자명

---------- ---------- -------------------- ----------

1 가길동 관리부

2 나길동 영업부 가길동

3 다길동 관리부 가길동

만약 여러분이 나중에 MS의 SQL Server등에서 질의를 하는 경우라면 다음과 같이 하면 된다. 물론 오라클에서 아래와 같이 사용하면 오류가 난다.

SQL> select "사원".sawon_id "사원ID",

2 "사원".name "사원명",

3 "사원".buseo "부서명",

4 "관리자".name "관리자명"

5 from sawon "사원", sawon "관리자"

6 where "사원".manager_id *= "관리자".sawon_id;

다른 예문을 보도록 하자.

[사원 테이블, EMP]

[부서 테이블, DEPT]

-- 부서별 사원수 출력, 사원이 한명도 없는

-- 40번 OPERATION 부서는 출력되지 않는다.

select dname, count(e.empno) from emp e, dept d

where e.deptno = d.deptno

group by dname;

-- right outer join

select dname, count(e.empno)

from emp e right outer join dept d

on e.deptno = d.deptno

group by dname;

select dname, count(e.empno)

from emp e right outer join dept d

using(deptno) group by dname;

-- 사원이름과 부서명을 출력

-- KING도 출력하고 40번부서도 동시에 출력

-- 오라클, MS-SQL 가능

select ename, dname from emp full outer join dept

on emp.deptno = dept.deptno;

-- MySQL

select ename, dname from emp right outer join dept

on emp.deptno = dept.deptno

union

select ename, dname from emp left outer join dept

on emp.deptno = dept.deptno;

-- MySQL은 오라클 형식(+)은 지원안함.

select ename, dname from emp, dept where emp.deptno(+) = dept.deptno(+);

--이해가 되었다면 예문을 통해 Outer Join을 확실히 이해 하도록 하자. Outer Join을 이해 하지 못한 상태에서 실제 업무에서 조인을 사용한다면 대량의 데이터를 처리 할 때 조인 처리 미숙으로 인해 누락되는 데이터가 나와 원인을 찾으려면 어려운 경우를 만날 수 있을 것이다. 반드시 이해하고 넘어 가도록 하자.

--실습을 위해 SALES(매출 테이블)와 CUSTOMER(고객 테이블)을 먼저 만들자. 혹시 이미 만들어져 있다면 DROP TABLE 구문으로 삭제 후 다시 만들자.

SQL> create table customer (

2 cust_id varchar2(4) not null primary key,

3 name varchar2(10),

4 tel varchar2(20)

5 );

테이블이 생성되었습니다.

SQL> create table sales (

2 cust_id varchar2(4) not null constraints fk_cust_id references customer(cust_id),

3 ilja varchar2(8) not null,

4 amt number(7,0) not null

5 );

SQL> insert into customer values ('1004','가길동','111-1111');

1 개의 행이 만들어졌습니다.

SQL> insert into customer values ('1005','나길동','222-2222');

1 개의 행이 만들어졌습니다.

SQL> insert into customer values ('1006','다길동','333-3333');

1 개의 행이 만들어졌습니다.

SQL> insert into sales values ('1004','20140301',10000);

1 개의 행이 만들어졌습니다.

SQL> insert into sales values ('1006','20140310',20000);

1 개의 행이 만들어졌습니다.

SQL> commit;

커밋이 완료되었습니다.

SQL> select * from sales;

CUST ILJA AMT

---- -------- ----------

1004 20140301 10000

1006 20140310 20000

SQL> select * from customer;

CUST NAME TEL

---- ---------- --------------------

1004 가길동 111-1111

1005 나길동 222-2222

1006 다길동 333-3333

--고객성명, 매출일자, 매출액의 형태로 고객 테이블에 등록된 모든 고객에 대해 출력해야 한다고 하자. 즉 매출이 없더라도 매출액이 0원으로 매출리스트에 나타나야 한다는 의미이다. 매출내역 테이블에는 고객의 이름이 없으니 고객 테이블과 조인을 하여 고객의 이름을 가지고 와야 한다. 그런데? 매출을 일으키지 않은 1005번 고객이 누락된 것이 보이는가? EquiJoin 등을 구사하는 경우 종니 조건을 만족하지 않는 행은 출력 되지 않는 것이 기본이다. 그럼 어떻게 할 것 이다. 물론 이런 경우를 위해 Outer Join이 있는 것이다. 아래의 3가지 형태는 같은 기능을 하는 예문 이다. ON을 사용 한것과 USING을 사용 한 두 번째, 세 번째 예문은 ANSI 표준에 부합되므로 다른 데이터베이스등에서 동일하게 사용 할 수 있다. 주로 첫번째 형태를 많이 이용하며 두번째, 세번째 예문의 경우 from절 다음을 다음과 같이 from sales s inner join customer c 와 같이 써도 무방하다.

SQL> select c.name, s.ilja, s.amt

2 from sales s, customer c

3 where s.cust_id = c.cust_id;

NAME ILJA AMT

---------- -------- ----------

가길동 20140301 10000

다길동 20140310 20000

SQL> select c.name, s.ilja, s.amt

2 from sales s join customer c

3 on s.cust_id = c.cust_id;

NAME ILJA AMT

---------- -------- ----------

가길동 20140301 10000

다길동 20140310 20000

SQL> select c.name, s.ilja, s.amt

2 from sales s join customer c

3 using (cust_id);

NAME ILJA AMT

---------- -------- ----------

가길동 20140301 10000

다길동 20140310 20000

--아래는 Left Outer Join의 예문이다. 왼쪽에 있는 것은 조인 조건이 맞지 않더라도 다 나타나야 한다는 것이다. 아래의 두 예문은 같은 결과를 나타내는 예문이다. 두번째에서 (+)의 위치를 잘 보라, CUSTOMER쪽에 있으니 SALES쪽이 조건에 맞지 않는 컬럼이 있더라도 모두 나타나야 한다는 것이다.

SQL> select c.name, s.ilja, s.amt

2 from sales s left outer join customer c

3 on s.cust_id = c.cust_id;

NAME ILJA AMT

---------- -------- ----------

가길동 20140301 10000

다길동 20140310 20000

SQL> select c.name, s.ilja, s.amt

2 from sales s, customer c

3 where s.cust_id = c.cust_id(+);

NAME ILJA AMT

---------- -------- ----------

가길동 20140301 10000

다길동 20140310 20000

--아래 예문은 Right Outer Join의 예문이다. 바로 아래 예문을 보면 오른쪽에 있는 CUSTOMER 테이블의 내용은 조인에 맞지 않더라도 다 나와야 한다는 의미이다. 즉 매출이 없더라도 고객테이블에 등록되어 있는 고객 이라면 출력이 된다는 의미이다. 그 다음 예문을 보라 (+)의 위치가 어디인가? SALES 쪽이므로 CUSTOMER가 조인 조건에 맞지 않더라도 모두 출력 되어야 한다는 의미이다.

SQL> select c.name, s.ilja, nvl(s.amt, 0)

2 from sales s right outer join customer c

3 on s.cust_id = c.cust_id;

NAME ILJA NVL(S.AMT,0)

---------- -------- ------------

가길동 20140301 10000

다길동 20140310 20000

나길동 0

SQL> select c.name, s.ilja, nvl(s.amt, 0)

2 from sales s, customer c

3 where s.cust_id(+) = c.cust_id;

NAME ILJA NVL(S.AMT,0)

---------- -------- ------------

가길동 20140301 10000

나길동 0

다길동 20140310 20000

--다음은 Full Outer Join에 관련된 예문이다. 조인시 양쪽 테이블의 데이터를 전부 출력 하기 위해 사용하는 형식이다. 즉 서로 조인 조건에 맞지 않는 것이 있더라도 모두 표시 하라는 의미인데 두번째 예문에서 주의 할점은 (+) 표시는 한곳에만 할 수 있는데, (+)형태로 Full Outer Join을 표시 하지 못한다는 것을 기억하자.

--실습을 위해 sales 테이블에 고객테이블에 없는 고객으로 한건입력하자.

SQL>> insert into sales values ('1007','20140301',20000);

SQL> select c.name, s.ilja, nvl(s.amt, 0)

2 from sales s full outer join customer c

3 on s.cust_id = c.cust_id;

NAME ILJA NVL(S.AMT,0)

---------- -------- ------------

가길동 20040301 10000

다길동 20040310 20000

나길동 0

20040301 20000

-- 오라클에서 양쪽 모두에 (+)사용은 오류.

SQL> select c.name, s.ilja, nvl(s.amt, 0)

2 from sales s, customer c

3 where s.cust_id(+) = c.cust_id(+);

where s.cust_id(+) = c.cust_id(+)

*

3행에 오류:

ORA-01468: outer-join된 테이블은 1개만 지정할 수 있습니다

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...