programing

연산자 문제 Oracle에 없음

css3 2023. 10. 22. 20:18

연산자 문제 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