반응형
테이블 작업을 하다 보면,
여러 테이블의 데이터를 조인해서 가져오도록 설계를 많이 합니다.

그러다 보면 데이터가 기본 1:1 혹은 1:N개로 존재를 해야 하는데,
그렇지 않을 경우 즉, 1:0으로 된 데이터를 가져와야 할 경우도 있습니다.

보통의 테이블 조인을 INNER JOIN이라 말을 하고,
저런 데이터가 없는 경우에도 가져와야 하는 JOIN을 OUTER JOIN 이라고 합니다.

아래와 같은 테이블이 있습니다.

select * from table1;

field1         field2       field3

200901  1   40

200901  2   40

200901  3   40

200901  4   40

200901  5   40

200901  6   40

200901  7   40

200901  8   40

 

select * from table2;

field1         field2       field3

200901  1   50

200901  2   60

200901  3   70

200901  4   80


INNER JION의 경우, 평소에 하던 대로 하면 됩니다.
SELECT a.*, b.*
FROM table1 a, table2 b
WHERE a.field1 = a.field1
  AND a.field2 = b.field2
굳이 다른 방식으로 이해하려 하지 않아도 됩니다.

위 테이블 두개를 묶어서 관련된 데이터 b.field3값도 확인하고 싶습니다. 이때, 없는 레코드의 경우도 보여주고 싶을 때는 OUTER JOIN을 사용하게 됩니다.

OUTER JOIN의 경우는 좀 복잡합니다. 물론 INNER JOIN 의 정확한 것을 배워도 되지만,
일단 FM은 아래와 같습니다.
SELECT a.*, b.field3
FROM table1 a OUTER JOIN table2 b ON a.field2 = b.field2
WHERE a.field1 = '200901'
JOIN 부분은 없어도 NULL 값으로 연결을 해주고,
WHERE 이하 구문은 INNER JOIN 형태로 연결을 해줍니다.

현재도 *= 문법을 지원을 하고 있으나,
몇가지 버그 등의 문제로 추천하는 문법은 아닙니다.
반응형
블로그 이미지

센스쟁이 프로그래머 비트센스

뷰파인더로 보는 프로그래머의 세상 페이스북 @bitsense 트위터 @picory 스카이프 picory MSN drawhalf@dreamwiz.com

댓글을 달아 주세요

반응형
짬짬히 이런 저런 작업을 하면서 글을 쓰기 때문에,
실제 사용하는 것만 올립니다. 덕분에 글이 짧네요.

MSSQL에서 날짜 연산 방법입니다.

예. 어제 일자를 알고 싶다.
select getdate(), dateadd(d, -1, getdate())
쉽죠? ^^;;

연산 날짜 부분(datepart) 인지는 몇개 없습니다.

yy : 년
mm : 월
dy, y : dayofyear (먼지 잘 모르겠음)
d : 일
wk : 주
hh : 시
mi, n : 분
s : 초
ms : 밀리세컨드
반응형
블로그 이미지

센스쟁이 프로그래머 비트센스

뷰파인더로 보는 프로그래머의 세상 페이스북 @bitsense 트위터 @picory 스카이프 picory MSN drawhalf@dreamwiz.com

댓글을 달아 주세요

반응형
현재 실행중인 DB 프로세스 확인 방법은?

postgres=# select * from pg_stat_activity;

현재 실행중인 쿼리, 접속 후 대기 중인(IDLE) IP 등이 출력됩니다.

-------+----------+---------+----------+----------+---------------------------------+---------+-------------------------------+-------------------------------+-------------------------------+-----------------+-------------
datid | datname  | procpid | usesysid | usename  |          current_query          | waiting |          xact_start           |          query_start          |         backend_start         |   client_addr   | client_port
-------+----------+---------+----------+----------+---------------------------------+---------+-------------------------------+-------------------------------+-------------------------------+-----------------+-------------
16386 | shop     |    7933 |    16384 | shopcafe | <IDLE>                          | f       |                               | 2009-01-13 16:58:25.424858+09 | 2009-01-13 16:58:25.354049+09 | 118.219.233.56  |       39856
16386 | shop     |    7811 |    16384 | shopcafe |
    SELECT * from members where id='test'
                                   | f       | 2009-01-13 16:58:25.874498+09 | 2009-01-13 16:58:25.874498+09 | 2009-01-13


반응형
블로그 이미지

센스쟁이 프로그래머 비트센스

뷰파인더로 보는 프로그래머의 세상 페이스북 @bitsense 트위터 @picory 스카이프 picory MSN drawhalf@dreamwiz.com

댓글을 달아 주세요

반응형
DB 작업을 하다 보면 때로,
서로 다른 데이터가 있는 테이블에서 합쳐서 보여줘야 하는 경우가 간혹 생깁니다.
INNER JOIN 이나 OUTER JOIN 등으로 할 수 없는 상황입니다.

이런 경우 필요한 것이 바로 UNION 입니다.

UNION은 MySQL에서도 지원하는 것으로 알고 있습니다.

UNION에서 주의할 점은 두 테이블을 하나로 합치는 것이기 때문에
추출하는 테이블의 필드 이름, 타입, 그리고 필드 갯수가 일치해야 합니다.
select f1, f2, f3, f4, "1" as f5
from table1
where f1='aaa'
UNION
select a as f1, b as f2, c as f3, d as f4, "2" as f5
from table2
where a='bbb'
테이블명은 alias를 해서 맞춰 주면 되고, 형변환은... 알아서.. ^^;;

팁으로, 해당 데이터가 어느 테이블에서 왔는지 알고 싶은데,
데이터 값만으로는 구분하기 힘든 경우에는
"1", "2" 이런 식이나 기타 구분이 가능한 방식으로 고정값을 추가해서
그것으로 확인하면 됩니다.

다른 모든 조건은 기존 SELECT 문법을 따르고 있으니,
그것을 참조하시면 됩니다.
반응형
블로그 이미지

센스쟁이 프로그래머 비트센스

뷰파인더로 보는 프로그래머의 세상 페이스북 @bitsense 트위터 @picory 스카이프 picory MSN drawhalf@dreamwiz.com

댓글을 달아 주세요

반응형
MySQL 처럼 show databases;가 PostgreSQL에는 없을까?

있다!

pgsql> select datname from pg_datebase;

이렇게 하면 등록된 모든 DB목록이 나온다.

반응형
블로그 이미지

센스쟁이 프로그래머 비트센스

뷰파인더로 보는 프로그래머의 세상 페이스북 @bitsense 트위터 @picory 스카이프 picory MSN drawhalf@dreamwiz.com

댓글을 달아 주세요