CREATE TABLE AS SELECT 와 INSERT INTO SELECT 의 다른 결과값 0 6 808

by 자라선 [2019.05.28 08:42:30]


고객사로부터 뷰를 하나 넘겨받아 저희 테이블에 값을 INSERT 를 해야합니다.

하지만 이상하게 값들이 비정상적으로 삽입되는 거 같아 확인해보니 로우수가

원래는 178건 들어와야하지만 194건들어와 있었습니다.

 

INSERT SELECT 에서 잘못된거가 싶어 조회만해도 178건인데.. 

혹여나 해서 CREATE TABLE AS SELECT 를 사용하여 임의의 테이블에 값을 넣으면 또 잘들어갑니다..

 

제가봤을댄 고객사의 뷰가 문제같습니다. 이 뷰만 테이블화 하여 CREATE TABLE를 해도 값이 비정상적으로 들어오는걸 확인했습니다.

뷰안을 까보니 SELECT FUNCTION 으로 이루어져있어 속도가 느린거같은데 이게 원인인건지 알수없습니다..

또 웃긴건 이 뷰만으로 조건을 줘서 한사람의 정보만 조회했을때 와 전체로 조회 후 한사람의 정보를 보면 서로 둘의 값들이 다릅니다..

 

아 참고로 오라클입니다.

by 우리집아찌 [2019.05.28 09:08:34]

​​​​뷰내부의 대상 테이블값이 자꾸 바뀌는건 아닐까요?


by 자라선 [2019.05.28 09:22:21]

답변감사합니다

바뀌는 것 이라 .. 한사람의 정보만 조회할거랑 전체조회후 한사람의 정보볼때랑 값들이 매번 조회시 같습니다...

그리고 이 뷰 특성상 잘쓰이지 않는 뷰인지라..

참 아이러니하네요 ..


by 마농 [2019.05.28 09:36:59]

현상에 대한 표현을 정확하게 해주셔야 하는데..
오타인지? 의미가 불분명하거나, 앞뒤가 안맞는 모순된 표현이 많네요.

1. CREATE TABLE AS SELECT 를 사용하여 임의의 테이블에 값을 넣으면 또 잘들어갑니다..
2. 이 뷰만 테이블화 하여 CREATE TABLE를 해도 값이 비정상적으로 들어오는걸 확인했습니다.
이 두 표현은 서로 모순 아닌가요?

3. 이 뷰만으로 조건을 줘서 한사람의 정보만 조회했을때 와 전체로 조회 후 한사람의 정보를 보면 서로 둘의 값들이 다릅니다..
4. 한사람의 정보만 조회할거랑 전체조회후 한사람의 정보볼때랑 값들이 매번 조회시 같습니다...
이 두 표현도 서로 모순 이구요.

"잘 쓰이지 않는 뷰" 와 테이블의 값이 자주 변경되는 것과는 다른 문제인 듯 하구요.

뷰 소스를 보여 줄 수 있나요?


by 자라선 [2019.05.28 10:09:25]

너무 당황해서 제가 이상하게 썻네요. 지금 글에 나오는 정상 비정상은 무시부탁드립니다.

방금 하다 알게되었는데 178건이 맞는지 194건이 맞는지 정답을 알수가 없었습니다..

 

1. 잘들어간다는 의미는 178건으로 들어간다는 의미였습니다. 178건이 맞는 로우값인줄 알았지만 그게 확답이라곤 할수없을것 같습니다.

2. 뷰가 문제 일듯싶어 뷰로 테스트 테이블을 만들어서 비교를 해보았습니다. 하지만 이도 값들이 이상한것 같더군요...

3.  이건 예를 들어 '20190000' 의 해당 인원을 조회할려했을때 아래의 두개의 쿼리의 SCORE 의 값이 다릅니다.

--2018년도의 전체를 가져오는 쿼리, 결과 값을 엑셀로 내려받아 '20190000' 번호의 인원의 SCORE 값을 직접조회, 이때 해당 번호는 로우가 2개나 나오며 SCORE 하나는 0 하나는 10

SELECT ID, SCORE FROM VIEW WHERE YEAR ='2018'

--2018년도 중에 '20190000' 만 가져오는 쿼리, 이때 로우는 하나만 나오며 SCORE는 10

SELECT ID, SCORE FROM VIEW WHERE YEAR ='2018' AND ID ='20190000'

 

4. 이건 위의 답변으로 된거 같습니다.

해당 뷰의 쿼리는 아래와 같습니다.

SELECT    DISTINCT    A.STAFF_NO   AS sgaeinno  , A.STAFF_FG  , A.HOOF_ST  , B.YY         AS year  ,
          SF_STAF620_SUM_SCOR( STAFF_NO, 'U0002001', B.YY, A.CAMP_FG) +              SF_STAF620_SUM_SCOR( STAFF_NO, 'U0002003', B.YY, A.CAMP_FG)                AS score,
          SF_STAF620_SUM_SCOR( STAFF_NO, 'U0002001', B.YY, A.CAMP_FG)  as score1,
          SF_STAF620_SUM_SCOR( STAFF_NO, 'U0002003', B.YY, A.CAMP_FG)  as score2
    FROM STAF210 A,  (   SELECT   DISTINCT     YY   , SHTM   , CAMP_FG   FROM STAF600 WHERE YY > TO_CHAR(SYSDATE,'YYYY') - 4 ) B
   WHERE A.STAFF_FG IN ( 'FP', 'EM')
    AND   A.HOOF_ST IS NOT NULL

 

당연히 권한이없어 뷰안에 결과값들은 확인하지 못합니다..

우선 정답을 알수없으니 SELECT 한 로우 와 값들 그대로 INSERT 하는것을 목표로 하고있습니다.

어이없는 질문이지만 답변 감사합니다.


by 마농 [2019.05.28 11:02:55]

Distinct 가 눈에 띄네요.
통상적인 경우 사용될 일이 없는 구문이고,
목적을 가지고 정확하게 사용되는 경우도 있지만
중복된다고 그냥 무조건 사용하는 경우도 많습니다.
중복의 원인을 찾아 해결해야 하는데 그냥 Distinct 만 붙이는 경우죠.

함수 안에 인자로 A.CAMP_FG 가 사용되는데? B 에도 CAMP_FG 가 있네요?
B.CAMP_FG 는 사용되지 않고 있고,
B.SHTM 도 사용되지도 않고 있구요.

전반적으로 중복이 발생할 수 밖에 없는 쿼리 구조이고
잘못된 방법으로 중복을 제거하려 하고 있네요. Distinct

하나의 id 에 스코어 값이 두개가 나오려면? A.CAMP_FG 값이 두개 일 듯 하네요.


by 자라선 [2019.05.28 12:19:45]

저 뷰는 제가 수정할수없어서 어쩔수없이 별짓 다하면서 어찌저찌 처리는 했습니다

원래는 저 뷰와 같이 JOIN 해서 INSERT를 하는 작업이였는데

뷰를 그냥 스칼라 서브쿼리로 넘겨서 진행하니 원하는 값이 들어오더군요.. 아직도 이유는 모르겠습니다

답변감사합니다.

 

이 댓글 작성하면서 똥!꼬!쇼는 필터링 걸어놔서 작성안되네요..

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