쿼리문 질문 드려도 되나요???

2
0

안녕하세요. 쿼리문을 작성하다가 이상해서 이렇게 문의 드립니다.
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

끝까지 읽어 주셔셔 감사합니다.


2
1

쿼리를 질문하셔도 전혀 문제가 될 수 없지만, 기간계는 직접 접속하기 전에는 알 수 없죠
에러는 openquery 에 접속시 나오는 조건과 sql 서버가 LEFT JOIN 조건이 되지 않아서 발생하는 문제입니다.
두 테이블이 LEFT JOIN 조건이 되지 않아 일종의 힌트인 HASH 로 되도록 하신거네요

조건이 안된다는 것은
AND CONVERT(VARCHAR, TA1.UDATE,112) > CONVERT(VARCHAR, GETDATE()-1,112)

이렇게 될 때 이야기 인데
이런 경우 VARCHAR로 잘라 버리기 때문에 문제가 오히려 발생 할 수있습니다.
컬럼값까지 다 봐야 정확한 내용을 알 수 있습니다.

그리고,날짜값을 CONVERT로 잘라버리는 것은 성능적으로도 좋은 쿼리는 아니구요
인덱스도 못타게 됩니다 ㅜㅜ

  • 가경승민아빠
    쿼리문에서..SELECT TA1.MEMBER_NO , TA1.MEMBER_CNTFROM MSSQL_TABLE1 TA1where TA1.UID LIKE ‘UID%’ AND CONVERT(VARCHAR, TA1.UDATE,112) > CONVERT(VARCHAR, GETDATE()-1,112)이 쿼리문을 수행시에 데이터는 정상적으로 나옵니다.조건절의 TA1.UID LIKE ‘UID%’ CONVERT(VARCHAR, TA1.UDATE,112) > CONVERT(VARCHAR, GETDATE()-1,112)중 하나, 즉 어떤것을 하던지 UID만을 수행 또는 날짜 비교를 하던지 하나만 실행했을 경우에는 결과 값이 정상적으로 나옵니다.^^그리고 추가적으로 날자비교에서 어제 날자 이후로 입력이 된것을 찾고 싶은데…getdate()-1 하게 되면,,, 입력시간이 오후 2시라면 어제 오후 2시 이후로 입력이 된 것을 찾게 되는데요. 저는 어제 오전에 입력된것도 찾고 싶다라고 한다면… 어떤식으로 조건을 구성하는게 맞는지요?감사합니다.
  • bytes
    CONVERT 를 쓰지마세요 ^_^오늘이 1월 5일이죠?SELECT TOP10 * FROM TA1.UDATE WHERE CONVERT(VARCHAR, TA1.UDATE,112) > CONVERT(VARCHAR, GETDATE()-1,112)와SELECT TOP10 * FROM TA1.UDATE WHERE TA1.UDATE >=GETDATE()-1 AND TA1.UPDATE <GETDATE()의 차이가 있을까요?오늘은 1월5일입니다.이 답은 SELECT GETDATE() 와 SELECT '2015-01-05'와 거의 유사한 값입니다SELECT GETDATE()-1 과 SELECT '2015-01-04' 도 거의 유사한 값입니다.차이는 GETDATE() 시는 시분초에 MS 단위까지 붙는데,숫자로 날짜를 쓰게 되면 00:00:00:000 이라 인식을 하게 되요 그래서 어제날짜보다 크거나 같고, 오늘보다 작으면 어제날짜의 00:00:00:000 ~ 23:59:59:997 의 값까지 찾게 되는 겁니다.이렇게 되면 인덱스가 날짜 값에 있는 경우 인덱스를 원활하게 타게 됩니다.시간 단위로 가게 되면 SQL 의 시간 함수를 이용해야 합니다. GETDATE는 정수단위의 시간은 날짜로 인식하는데 나머지는 단, 인덱스를 타게 하고자 하면 WHERE 조건문의 우측조건은 형변환을 하셔선 안됩니다.
  • bytes
    실시간 쿼리보다는 현재의 쿼리에 where 로 날짜를 인덱스 타게 하구요 임시테이블로 insert 후 시간별로 찾는게 더 빠르겠네요
  • 가경승민아빠
    감사합니다.
1
0

자문 자답이네요.^^

LEFT JOIN -> LEFT HASH JOIN 등의 옵션을 주고 실행하니 되네요.


총 2개 내용
의견 쓰기

쉐어드IT의 가입은 쉽고 간단합니다. 지금 하시고 IT관리자들과 의견을 함께 나누세요