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
운영게시판
최근게시물
PostgreSQL Q&A 7075 게시물 읽기
No. 7075
두 sql결과가 틀린 이유가 뭔지 혹시 아시나요?
작성자
궁금이
작성일
2007-03-14 01:28
조회수
4,199

같은 결과가 나올 줄 알았는데.. 결과가 다르게 나와서 놀랐어요~
왜 틀린지 혹시 아시나요?

SELECT * 
FROM FPDATAFUNCTIONWK
WHERE 
FPDATAFUNCTIONWK.KEMMEICD = '0606' AND 
FPDATAFUNCTIONWK.RIREKICD = '0002' AND 
FPDATAFUNCTIONWK.FPPATANITEMCD = '01' AND 
FPDATAFUNCTIONWK.FILETYPECD = '0001' AND 
FPDATAFUNCTIONWK.FILESEQ IN ( '2') AND 
FPDATAFUNCTIONWK.UPDID = '0606' AND 
FPDATAFUNCTIONWK.EDITFLG = '1'
AND EXISTS (
SELECT 1
FROM FPDATAFUNCTIONWK BEFOREDATA
WHERE 
BEFOREDATA.KEMMEICD = FPDATAFUNCTIONWK.KEMMEICD AND 
BEFOREDATA.RIREKICD = FPDATAFUNCTIONWK.RIREKICD AND 
BEFOREDATA.FPPATANITEMCD = FPDATAFUNCTIONWK.FPPATANITEMCD AND 
BEFOREDATA.FILETYPECD = FPDATAFUNCTIONWK.FILETYPECD AND 
BEFOREDATA.FILESEQ = FPDATAFUNCTIONWK.FILESEQ 
AND BEFOREDATA.EDITFLG = '0' ) ;
-> 아무것도 안나옴

SELECT * 
FROM FPDATAFUNCTIONWK
WHERE 
KEMMEICD = '0606' AND 
RIREKICD = '0002' AND 
FPPATANITEMCD = '01' AND 
FILETYPECD = '0001' AND 
FILESEQ IN ( '2') AND UPDID = '0606' AND 
EDITFLG = '1'
AND EXISTS (
SELECT 1
FROM FPDATAFUNCTIONWK BEFOREDATA
WHERE 
BEFOREDATA.KEMMEICD = KEMMEICD AND 
BEFOREDATA.RIREKICD = RIREKICD AND 
BEFOREDATA.FPPATANITEMCD = FPPATANITEMCD AND 
BEFOREDATA.FILETYPECD = FILETYPECD AND 
BEFOREDATA.FILESEQ = FILESEQ AND 
BEFOREDATA.EDITFLG = '0' ) ;
-> 한줄 나옴

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

재미난 구문이네요.

exists 구문에서 사용하는 where 절의 칼럼 표기 방식에서 
테이블을 지정하지 않았다면, 그 서브 쿼리에서 지정한 from 의 테이블이 됩니다.

앞구문은 명시적으로 서로 다른 테이블에 대한 inner join을 한 샘이 되고, 
(내부적으로 self join 이겠지만)

뒷 구문은 완벽한 self join이 되면서 서브쿼리의 검색 조건에서 그 상위 쿼리 검색조건과 
inner join을 할 수 없게 되어버립니다. 즉, 걸러지는게 아니라, 상위 쿼리 검색조건의 모든 자료가 나오겠죠.


무엇을 의도한 것인지는 자료 내용을 몰라서 전혀 모르겠지만, 
두 구문의 차이는 명백하네요.

제가 알기로는 대부분의 exists 구문은 inner join 구문으로 바꿀 수 있습니다.
윗 예제라면, self join 이 되겠네요.

가독성 떨어지는 exists 구문보다 self join 구문으로 바꾸는게 더 낫지 않을까싶네요. ^^

김상기(ioseph)님이 2007-03-14 04:11에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
7078execute 리턴값 [3]
난파
2007-03-16
4719
7077질문있습니다. [4]
조진우
2007-03-16
4273
7076psql 초보입니당 table을 예재를 보고 만들었는데 ... [1]
오승환
2007-03-15
4338
7075두 sql결과가 틀린 이유가 뭔지 혹시 아시나요? [1]
궁금이
2007-03-14
4199
7074날짜 조건 포함에 따른 속도 저하.. [2]
소심고양이
2007-03-12
5893
7073[급함]다시한번 질문 드립니다. [1]
나그네
2007-03-10
4136
7072잔액 계산을 하는 쿼리 질문입니다. [1]
가우나라
2007-03-06
4473
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.026초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다