안녕하세요. 쿼리문을 작성하다가 이상해서 이렇게 문의 드립니다.
MSSQL 테이블과 LINKED DATABASE 관련하여 질문 드립니다.
SELECT
TA1.MEMBER_NO
, TA1.MEMBER_CNT
, TA1.UID
, TA1.UDATE
, TA2.MEMBER_ID
, TA3.MEMBER_ID
FROM MSSQL_TABLE1 TA1
LEFT JOIN OPENQUERY(ORACEL, SELECT * FROM ORACLE_TABLE2) TA2 ON TA1.MEMBER_NO = TA2.ORACELE_TABLE2.MEMBER_ID
LEFT JOIN OPENQUERY(ORACLE, SELECT * FROM ORACLE_TABLE3) TA3 ON TA1.MEMBER_NO = TA3.ORACLE_TABLE3.MEMBER_ID AND TA1.MEMBER_CNT = TA3.MEMBER_CNT
WHERE TA2.ORACLE_TABLE2.MEMBER_ID IS NOT NULL
AND TA1.UID LIKE ‘UID%’
AND CONVERT(VARCHAR, TA1.UDATE,112) > CONVERT(VARCHAR, GETDATE()-1,112)
상기 처럼 쿼리를 진행했을때…
연결된 서버 “ORACEL”의 OLE DB 공급자 “OraOLEDB.Oracle”이(가) 메시지 “ORA-01403: 데이터를 찾을 수 없습니다.”을(를) 반환했습니다.
메시지 7346, 수준 16, 상태 2, 줄 1
연결된 서버 “ORACEL”의 OLE DB 공급자 “OraOLEDB.Oracle”에서 행 데이터를 가져올 수 없습니다.
메시지가 나오고…
WHERE 절에서
AND TA1.UID LIKE ‘UID%’
AND CONVERT(VARCHAR, TA1.UDATE,112) > CONVERT(VARCHAR, GETDATE()-1,112)
중 하나를 주석처리 하면 쿼리는 정상적으로 나오네요…
조건절 모두 MSSQL 테이블의 조건인데… 왜??? ORACLE 관련 에러가 나오죠??
머가 문제인가요??
SQL 버전 : MSSQL 2012 11.0.5343.0(X64)
ORACLE VER : 11g
끝까지 읽어 주셔셔 감사합니다.
Comment 4
-
Terry
2015.12.30 14:02
-
가경승민아빠
2015.12.30 14:43
답변 감사합니다만... 해보았는데 안되요. ㅠㅠ
-
minsouk
2015.12.30 14:09
문제 해결을 위한
제안 1
1, linked server 속성에서 allow inprocess 를 check
2, SQL Server 리스타트가 필요할 수 있음 (링크드 서버를 다시 만들던지)
3, oledb 로 연결한 경우 allow inprocess 를 체크하지 않으면, 인증정보를 전달하지 못한다.
제안 2
SQL Server 의 테이블인 TA1 의 조건절을 먼저 적용한후 임시테으블로 담은 후 쿼리
제안 3
4 parts name 으로 쿼리
성능을 위한
제안 1
데이터가 많을경우
Oracle 의 필요테이블을 SQL 의 임시 테이블로 담아 인덱스를 만든 후 쿼리
임시테이블 삭제
제안 2
오라클과 조인되는 데이터가 한 두 개 찍을수 있다면(데이터가 작다면), inner remote join 힌트를 이용해 하나 하나 찍어서 가져오게 힌트추가
제안 3
option (hash join) 추가 나 inner hash join 힌트 추가
-
가경승민아빠
2015.12.30 14:45
답변 감사합니다....
제안 3(LEFT HASH JOIN)으로 해결 되었네요...
근본적인 해결책은 될수는 없겠지만..
하기처럼 진행해보세요..
안될수도 있어요..-.-;;;
문제가 되는 구문자체를
인라인뷰로 묶고
묶은 뷰 데이터를 다시 조인하는 형태로 했어요..
안될 가능성이 더 높습니다..
근본적인 원인파악후 해결방법이 아니기에^^;;
---쿼리시작---
SELECT
TA1.MEMBER_NO
,TA1.MEMBER_CNT
,TA1.UID
,TA1.UDATE
,TA2.MEMBER_ID
,TA3.MEMBER_ID
FROM (
SELECT
TA1.MEMBER_NO
,TA1.MEMBER_CNT
,TA1.UID
,TA1.UDATE
FROM MSSQL_TABLE1 TA1
WHERE TA1.UID LIKE ‘UID%’
AND CONVERT(VARCHAR, TA1.UDATE,112) > CONVERT(VARCHAR, GETDATE()-1,112)
) TA1
LEFT JOIN OPENQUERY( ORACEL
, SELECT *
FROM ORACLE_TABLE2
) TA2 ON TA1.MEMBER_NO = TA2.ORACELE_TABLE2.MEMBER_ID
LEFT JOIN OPENQUERY(
ORACLE
, SELECT *
FROM ORACLE_TABLE3
) TA3 ON TA1.MEMBER_NO = TA3.ORACLE_TABLE3.MEMBER_ID AND TA1.MEMBER_CNT = TA3.MEMBER_CNT
WHERE TA2.ORACLE_TABLE2.MEMBER_ID IS NOT NULL
---쿼리끝---