database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 22002 게시물 읽기
No. 22002
쿼리에 대한 기본개념을 흔들어 버린 쿼리
작성자
이무용(rainfeel)
작성일
2005-03-15 14:13ⓒ
2005-03-15 14:14ⓜ
조회수
3,482

SELECT
K.KOJIN_NO KOJIN_NO,
K.ID_NO ID_NO,
K.NAME NAME,
C.COMPANY_NAME COMPANY_NAME,
S.SECTION_NAME SECTION_NAME,
M.STAFF_KBN_NAME STAFF_KBN_NAME,
K.STATUS STATUS,
K.LIMIT_DATE_TO LIMIT_DATE_TO
FROM
MST_KOJIN K,
MST_COMPANY C,
MST_SECTION S,
MST_STAFF_KBN M

WHERE
K.KOJIN_NO LIKE '%5%'

 

?? ?? ??? ????.

K.KOJIN_NO LIKE '%5%'? ???? ???? ??? ???? ?????. ?? ????? ??????.

???, ??? ?? ???? ???? ?? MST_CAR ?? ???? ???? ?? ?? ???????.

 

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

 

SELECT
K.KOJIN_NO KOJIN_NO,
K.ID_NO ID_NO,
K.NAME NAME,
C.COMPANY_NAME COMPANY_NAME,
S.SECTION_NAME SECTION_NAME,
M.STAFF_KBN_NAME STAFF_KBN_NAME,
K.STATUS STATUS,
K.LIMIT_DATE_TO LIMIT_DATE_TO
FROM
MST_KOJIN K,
MST_COMPANY C,
MST_SECTION S,
MST_STAFF_KBN M,
MST_CAR CA

WHERE
K.KOJIN_NO LIKE '%5%

 

??? ???? ???? ???? ??? ????. ??? ???? ??? ? ?????? ??????, ?? ??? ??... ????. ???? ??? ?? ???? ?? ? ?? ??? ???? ??? ???... ? ??????

 

????, ???? ?? ???? ??? ?? ???? ??? ??? ??? ?? ????

 

ps. ?? ???? ??? ???? ????. ?? ????? from ?? MST_CAR? ?? ??? ?? ???, ???? ?????.

 

?? ??? ?? ??, ??????.

???????? ??... ??~~

이 글에 대한 댓글이 총 8건 있습니다.

 

위 글이 글자가 깨지기 때문에 덧글에 다시 적습니다. ^^

그럼 잘 부탁드립니다.

 

SELECT 
    K.KOJIN_NO KOJIN_NO, 
    K.ID_NO ID_NO,
    K.NAME NAME,
    C.COMPANY_NAME COMPANY_NAME,
    S.SECTION_NAME SECTION_NAME,
    M.STAFF_KBN_NAME STAFF_KBN_NAME,
    K.STATUS STATUS,
    K.LIMIT_DATE_TO LIMIT_DATE_TO
FROM 
    MST_KOJIN K, 
    MST_COMPANY C, 
    MST_SECTION S, 
    MST_STAFF_KBN M

WHERE 
    K.KOJIN_NO LIKE '%5%'

 

    위와 같은 쿼리가 있습니다.

K.KOJIN_NO LIKE '%5%'에 해당되는 데이터가 있기에 결과값이 나왔습니다. 이건 당연하다고 생각했습니다.

    그런데, 거기에 아무 데이터도 들어있지 않은 MST_CAR 라는 테이블을 아래처럼 프롬 뒤에 추가시켰습니다.

 

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

 

SELECT 
    K.KOJIN_NO KOJIN_NO, 
    K.ID_NO ID_NO,
    K.NAME NAME,
    C.COMPANY_NAME COMPANY_NAME,
    S.SECTION_NAME SECTION_NAME,
    M.STAFF_KBN_NAME STAFF_KBN_NAME,
    K.STATUS STATUS,
    K.LIMIT_DATE_TO LIMIT_DATE_TO
FROM 
    MST_KOJIN K, 
    MST_COMPANY C, 
    MST_SECTION S, 
    MST_STAFF_KBN M, 
    MST_CAR CA

WHERE 
     K.KOJIN_NO LIKE '%5%

 

    당연히 나올거라 생각했던 데이터가 나오지 않더군요. 그래도 기본적인 쿼리는 좀 만들어봤다고 생각했었는데, 잠시 어안이 벙벙... 하더군요. 데이터가 하나도 없는 테이블이 프롬 절 뒤에 붙으면 결과값은 무조건 널이다... 가 정답인가요?

 

    그렇다면, 데이터가 없는 테이블이 있어도 있는 값이라도 나오게 하려면 어떻게 해야 할까요?

 

ps. 위의 쿼리문은 간략화 시켜놓은 것입니다. 위의 쿼리에서는 from 뒤에 MST_CAR가 붙을 필요가 전혀 없지만, 실제로는 필요합니다.

 

그럼 아시는 분은 설명, 부탁드립니다.

초보프로그래머로 부터... 꾸벅~~

이무용(rainfeel)님이 2005-03-15 14:16에 작성한 댓글입니다.

안녕하세요.

저도 초보지만 조금 끄적여봅니다.

 

MTS_CAR가 프롬절에 추가되면 조인이 되겠죠..

하지만 조인하려는 내용이 없다보니 아무값도 안나오는것 같습니다.

산수쪽으로 생각하면 * 0을 해준 것과 비슷할지도 모르겠네요..

 

간략하게 어떤 테이블 A와 B를 조인하고 where절에 B테이블은 만족하는 로우가 하나도 없게 하면 결과가 한줄도 안나오는 것을 보실 수 있을겁니다.

 

 

테이블 자체가 비었을때 결과가 나오게 하는 방법은 잘 모르겠네요..

 

죄송합니다~

정준오(junokun)님이 2005-03-15 14:30에 작성한 댓글입니다.

오사카의 무용군같은데..

답이 될런지요..

 

CREATE TABLE TEST_A
(
 a VARCHAR(10),
 b VARCHAR(10)
);

 

CREATE TABLE TEST_B
(
 c VARCHAR(10),
 d VARCHAR(10)
);

 

INSERT INTO TEST_A
VALUES('1','2222225');

 

SELECT
*
FROM
TEST_A, TEST_B
WHERE
TEST_A.b = TEST_B.d(+)
AND
TEST_A.b like '%5%';

 

값이 있는 테이블 전체랑 값이 없는 테이블 하나를

아웃조인으로 묶어 버리세요..

 

요코하마의 준이아빠가..

june님이 2005-03-15 14:55에 작성한 댓글입니다. Edit

 

조인이 다 어디 갔나요?
김흥수(protokhs)님이 2005-03-15 16:06에 작성한 댓글입니다.

답변들 감사합니다.

조인이 어딨냐고 하시는 분들이 계신데... 원래 조인이 없는 쿼리입니다.

조인이 없이 FROM절 뒤에 데이터가 없는 테이블이 붙는 자체로 결과값이 널이 나오더라구요. (더 정확히 말하자면, 빈레코드도 없는... 크리에이트 된 직후의 테이블의 경우. or 오브젝트 브라우져들의 툴로 데이터를 꼭 찝어서 다 지운경우.)

 

준이아빠님 감사합니다. 요코하마 쪽이셨군요. ^^

항상 도움받고 있습니다.

 

그럼 다들 좋은 하루 되시기 바랍니다.

이무용(rainfeel)님이 2005-03-15 16:46에 작성한 댓글입니다.
이 댓글은 2005-03-15 16:47에 마지막으로 수정되었습니다.

M => M

M*1 => M

M*1*1*1 => M

M*1*1*1...*1 => M

M*0 => 0

M*1*1*1...*0 => 0

 

1은 아무리 많은 값이래도 원래집합을 변화시키 않고...

아무리 많은 과정이 있더라도 원래집합에 공집합을 공급(곱)하면..

공집합이 됩니다..

 

공집합을 1로 만들어주는 방법은..

인라인뷰로 묶어서 집합함수를 취하는 것입니다..

select IsNull(1, 0)

from emp

where 1 = 2

 

이렇게 하면... No Rows가 나오겠죠..

0이 나오지 않습니다..

하지만

select IsNull(Max(1), 0)

from emp

where 1 = 2

이렇게 하면 0을 나오게 할 수 있습니다..

Null인 row하나를 리턴하는것이지요..

 

오라클은 IsNull이 아니구.. NVL이군요..

지금 SQL Server를 쓰고 있어서.. 헷갈렸습니다..

 

mur님이 2005-03-15 16:48에 작성한 댓글입니다.
이 댓글은 2005-03-15 16:53에 마지막으로 수정되었습니다. Edit

Catesian 곱을 이용한 Join을 이용하는 경우 ( 즉, Where절에 join조건을 주지 않는경우 ) 기본 원칙은 한쪽의 ROW에 대해 다른 한쪽이 무조건 만족한다는 조건입니다.

 

결과적으로 NULL 테이블과의 카테시안 JOIN의 경우

한쪽 ROW에 대해 다른한족이 무조건 만족하지 못하므로 NULL 이나오는건 당연한 결과입니다.

 

예를들어 10,000건 ROW 테이블 A, 1,000건 ROW 테이블 B 의 카테시안 곱 JOIN 경우 10,000 * 1,000 건의 결과가 추출되듯이 0건 ROW 테이블과 카테시안 곱 JOIN을 하시면

10,000 * 1,000 * NULL 이되어 결과는 NULL 이 됩니다.

 

 

 

 

손님님이 2005-03-16 10:05에 작성한 댓글입니다. Edit

테이블은 5개나 되는데 조인이 하나도 없다니....

 

과연 기본개념을 흔들어 버린 쿼리 맞네요... 쩝...

999님이 2005-03-16 10:12에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
22005Fatal error: Call to undefined function: ocilogon()
최성일
2005-03-15
2362
22004RMAN 으로 CLON DB 생성
정광철
2005-03-15
1745
22003오라클에서 scott/tiger와 같은 권한을 가진 user를 만들고 싶어요 [1]
2005-03-15
4259
22002쿼리에 대한 기본개념을 흔들어 버린 쿼리 [8]
이무용
2005-03-15
3482
22001Sql 바인딩. [5]
유성
2005-03-15
7332
22000테이블 파티션 할때 unique index 는 어떻게 생성하나요?
서지수
2005-03-15
2336
21999전체업데이트할때 속도여.... [3]
도와주세요.
2005-03-15
2226
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2022 DSN, All rights reserved.
작업시간: 0.149초, 이곳 서비스는
	PostgreSQL v13.3으로 자료를 관리합니다