연산자 문제 Oracle에 없음
제 질문은 다음과 같습니다.
Select a.* from Table1 a, Table2 b
Where
a.tid=b.tid and
b.createddate=(Select max(createddate) from Table2) and
a.tid not in (Select distinct tid from Table3);
문제는 이것이 일부 유효한 출력을 반환해야 한다는 것을 알고 있지만 그렇지 않다는 것입니다.a.tid에 있는 마지막 줄에 문제가 있는 경우 (Table3에서 구별되는 tid 선택); 만약 내가 표 3에서 구별되는 tid 선택을 ('T001', 'T001', 'T002'와 같은 하드 코딩된 값으로 대체한다면,T003' 'T004') 그러면 정상적으로 작동하고 데이터를 반환합니다.
무슨 일 있어요?내가 뭘 빼놓았나요?제발 도와주세요.
시도해 보기:
Select a.* from Table1 a, Table2 b
Where
a.tid=b.tid and
b.createddate=(Select max(createddate) from Table2) and
a.tid not in (Select tid from Table3 where tid is not null);
댓글에 있는 모든 사람들이 언급한 것처럼, 표 3에 null 값을 가진 행이 하나 이상 있으면 행을 반환하지 않습니다.왜냐하면 Oracle null은 "이 값이 무엇인지 모르겠다"고 말하는 것과 같습니다.Oracle은 이 "알 수 없는" 값이 실제로 무엇인지 모르기 때문에 검색 중인 값이 하위 선택 항목에 포함되지 않는다고 확실히 말할 수 없습니다.또한 문서에는 이와 같은 방식으로 작동한다고 나와 있습니다.
다른 옵션은 쿼리를 다음과 같이 쓰는 것입니다.
Select a.* from Table1 a, Table2 b
Where
a.tid=b.tid and
b.createddate=(Select max(createddate) from Table2) and
not exists (Select null from Table3 t3 where t3.tid = a.tid);
null 처리는 non과 non의 주요 차이점 중 하나입니다.
질문을 다시 작성했습니다.
Select a.*
from Table1 a join
Table2 b
on a.tid=b.tid
where b.createddate=(Select max(createddate) from Table2) and
a.tid not in (Select distinct tid from Table3)
이것이 알려주는 것은 표 2에서 최대 생성 날짜를 가진 tid가 표 3에 있다는 것입니다.
이를 테스트하려면 표 2에서 최대 생성 날짜를 가져옵니다.그럼 이 최대치에 해당하는 모든 레코드를 표 1에 구하세요.이들도 표 3에 나와 있습니다.
제가 추측해야 한다면, 전체 최대가 아니라 표 2의 표당 최대 작성 날짜를 원하실 수도 있습니다.
그런데 Oracle(및 대부분의 다른 데이터베이스)에서는 마지막 하위 쿼리에서 구별되는 것이 중복됩니다.데이터베이스는 이 경우 중복을 제거할 수 있을 정도로 똑똑해야 합니다.
언급URL : https://stackoverflow.com/questions/11548267/not-in-operator-issue-oracle
'programing' 카테고리의 다른 글
선언 지정자에 둘 이상의 데이터 형식 오류가 있습니다. (0) | 2023.10.22 |
---|---|
MySQL에서 데이터를 저장하는 방법 (0) | 2023.10.22 |
LINQ에서 MySQL로 - 가장 좋은 옵션은 무엇입니까? (0) | 2023.10.22 |
Linking a shared library against a static library: must the static library be compiled differently than if an application were linking it? (0) | 2023.10.22 |
호스트 서버에 MEAN 스택을 배포하는 방법은 무엇입니까? (0) | 2023.10.22 |