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 38757 게시물 읽기
No. 38757
테이블을 한번만 읽고 처리 하는 방법을 배우고 싶습니다
작성자
빨간운동화
작성일
2011-08-05 00:45
조회수
4,507

A   B
-   -
1

3   1
4
5   2
6
7
8   4
9

이렇게 한테이블에  컬럼  A,B 가 있고 , A컬럼은 PK 이며  PK인 값이 B컬럼에 존재하는것만
제외하고 싶습니다.

물론 B컬럼에 값이 있는것도 제외 되어야 합니다.

그럼 결과는 나와야 하고요.

A   B
-   -
6
7
9

제가 하는 방법은 이 테이블을 두번 읽고 하는 방법인데 한번만 읽고 처리하는 방벖은 없을까
문의 드립니다.
 

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

한번만 읽고 하는 방법은 딱히 없어보입니다만..

exists 문을 사용하여 부분범위처리로 하면 그나마 응답속도는 빨라보이는데요..

1님이 2011-08-05 08:50에 작성한 댓글입니다. Edit

WITH  A AS (
            SELECT 1 AS A, NULL B FROM DUAL UNION
            SELECT 2 AS A, NULL B FROM DUAL UNION
            SELECT 3 AS A, 1    B FROM DUAL UNION
            SELECT 4 AS A, NULL B FROM DUAL UNION
            SELECT 5 AS A, 2    B FROM DUAL UNION
            SELECT 6 AS A, NULL B FROM DUAL UNION
            SELECT 7 AS A, NULL B FROM DUAL UNION
            SELECT 8 AS A, 4    B FROM DUAL UNION
            SELECT 9 AS A, NULL B FROM DUAL
            )

SELECT *
  FROM A
 WHERE A NOT IN ( SELECT B FROM A WHERE B IS NOT NULL)
   AND CASE WHEN A IS NOT NULL AND B IS NOT NULL THEN 'Y'
            ELSE 'N'
       END = 'N'

장마철님이 2011-08-05 10:43에 작성한 댓글입니다. Edit

장마철님 글처럼 쿼리하시면 데이터가 많을때 상당히 느려지는 상황이 발생할수 있습니다.

 

WITH  tableA AS (

            SELECT 1 AS A, NULL B FROM DUAL UNION
            SELECT 2 AS A, NULL B FROM DUAL UNION
            SELECT 3 AS A, 1    B FROM DUAL UNION
            SELECT 4 AS A, NULL B FROM DUAL UNION
            SELECT 5 AS A, 2    B FROM DUAL UNION
            SELECT 6 AS A, NULL B FROM DUAL UNION
            SELECT 7 AS A, NULL B FROM DUAL UNION
            SELECT 8 AS A, 4    B FROM DUAL UNION
            SELECT 9 AS A, NULL B FROM DUAL
            )

SELECT *
  FROM tableA a
 WHERE B IS NULL

      AND NOT EXISTS (SELECT 1 FROM tableA b WHERE a.A=b.B AND ROWNUM=1)

 

 

이렇게 하심 반응은 좀 빨라지겠네요

1님이 2011-08-05 13:44에 작성한 댓글입니다. Edit

WITH t AS
(
SELECT 1 a, Null b FROM dual
UNION ALL SELECT 2, Null FROM dual
UNION ALL SELECT 3,    1 FROM dual
UNION ALL SELECT 4, Null FROM dual
UNION ALL SELECT 5,    2 FROM dual
UNION ALL SELECT 6, Null FROM dual
UNION ALL SELECT 7, Null FROM dual
UNION ALL SELECT 8,    4 FROM dual
UNION ALL SELECT 9, Null FROM dual
)
SELECT NVL(b, a) a
  FROM t
 GROUP BY NVL(b, a)
HAVING COUNT(*) = 1
;

마농(manon94)님이 2011-08-05 16:58에 작성한 댓글입니다.
이 댓글은 2011-08-05 17:44에 마지막으로 수정되었습니다.

오랫동안 고민하다 역시 이곳에서 답을 찾았습니다.

답변주신분들께 감사 인사 드립니다.

감사합니다.

빨간운동화님이 2011-08-05 20:22에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
38761analyze를 보고 있습니다 [4]
윤용진
2011-08-08
3718
38759시간차이 구하기 입니다. [2]
taiji
2011-08-05
4846
38758INTO [2]
장마철
2011-08-05
3307
38757테이블을 한번만 읽고 처리 하는 방법을 배우고 싶습니다 [5]
빨간운동화
2011-08-05
4507
38756쿼리질문입니다... [3]
한상원
2011-08-04
3351
38755B테이블에 1개 row입력시 A테이블 ROW수 만큼 n개의 row로 중복 생성하는 방법 [1]
이상대
2011-08-03
4879
38753proc컴파일후 gcc컴파일때 undefined reference to 'sqlcxt오류
이동희
2011-08-02
3747
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다