이런 경우 어떻게 조회해야할까요...? 0 4 1,130

by 광훨 [2015.07.20 09:13:28]


A 테이블에

CITY, LAL, RAN 컬럼이 PK로 잡혀있고,

B 테이블에 위 세개 컬럼이 FK로 잡혀있는 상태입니다.

그런데, 중간에 작업이 있어 해당 FK를 비활성화 시킨 상태에서 작업 종료 후 다시 활성화 시키려니 오류가 나네요.

아무래도 FK에 해당하지 않는 값들이 있어서 그런것 같은데, 어떻게 하면 문제되는 데이터들을 가져올 수 있을까요?

참고로... A테이블은 500만, B테이블은 4억건정도 존재하고 있는 상태입니다.

 

원래는 

select * from A

where (city, lal, ran) not in (select city, lal, ran from B group by city, lal, ran);

이렇게 검색해서 해당되는걸 솎아낸 후 다시 b테이블에서 검색할 생각이었는데, 이마저도 검색이 힘드네요... 휴;

by jkson [2015.07.20 09:21:02]
SELECT * 
  FROM A
 WHERE NOT EXISTS (SELECT 1
                     FROM B WHERE CODE = A.CITY) 
UNION ALL                     
SELECT * 
  FROM A
 WHERE NOT EXISTS (SELECT 1
                     FROM B WHERE CODE = A.LAL)
UNION ALL                                           
SELECT * 
  FROM A
 WHERE NOT EXISTS (SELECT 1
                     FROM B WHERE CODE = A.RAN)  

이런 식으로 조회해보면 되지 않을까요?

--

아 세 개가 동시에 fk로 걸려 있는 거군요;; 난독;; 


by 야신 [2015.07.20 13:11:01]
SELECT city
FROM B
Minus
Select city
From A

이런식으로 틀린 데이타를 찾아내는것은 어떤가요?

by 창조의날개 [2015.07.20 15:21:20]

-- CITY, LAL, RAN 3개 컬럼이 pk라고 했으니 3개를 다 비교해야 할듯 합니다.
-- 그리고 B 테이블에 FK로 걸려 있다고 하시니 INDEX가 있으리라 보고 GROUP BY를 하면 로우수를 좀 줄이겠네요..
-- 인덱스가 없다면 GROUP BY를 쓰지 마시고...

SELECT CITY, LAL, RAN
FROM B
GROUP BY CITY, LAL, RAN
Minus
Select CITY, LAL, RAN
From A

 


by 마농 [2015.07.20 15:29:51]
SELECT b.city, b.lal, b.ran
  FROM b
     , a
 WHERE b.city = a.city(+)
   AND b.lal  = a.lal (+)
   AND b.ran  = a.ran (+)
   AND a.city IS NULL
;

4억건이면 데이터가 많네요.
4억건 전체를 대상으로 검색하는 것 보다는
작업대상만 골라낼 수 있는 방법(원본 테이블 존재, 등록일시 확인 등)을 찾아서
해당 자료만을 대상으로 검색하시는 게 좋겠네요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입