복붙노트

[SQL] 쿼리 3 개 테이블 "NOT IN"MySQL은

SQL

쿼리 3 개 테이블 "NOT IN"MySQL은

내가 3 테이블 물론, 등급 및 평가가 있습니다. 나는 두 테이블 등급 및 평가를 비교합니다. 테이블 등급의 데이터가 테이블 평가에 존재하지 않는 경우, 데이터가 나타납니다 (출력)

"   select Grade.ID_Courses,Course.ID_Courses,Grade.NAME, 
    Course.NAME, Grade.ID_Courses,
    Evaluation.NAME,
    Evaluation.Year,    
    Grade.Year
    from Grade, Course, Evaluation
    WHERE 
    Grade.ID_Courses=Course.ID_Courses AND 
    Grade.NAME=JOHN and 
    Grade.Year=1 and 
    Evaluation.NAME=GRADE.NAME and
    Grade.ID_Courses NOT IN (SELECT ID_Courses FROM Evaluation where NAME=JOHN and Year=1 )
    GROUP BY Grade.ID_Courses"

문제는 이름 존 테이블 평가하지 않을 때 다음 더 출력이 출력되지 않고있다이다.

해결법

  1. ==============================

    1.전염병의 경우처럼 NOT IN 피

    전염병의 경우처럼 NOT IN 피

    SELECT ID_Courses FROM Evaluation where `NAME`='JOHN' and Year=1
    

    이제까지 NULL을 포함 할 수 있습니다. 대신, 사용하지 EXISTS 또는 왼쪽 조인

    명시 적 사용은 1980 년대 스타일이 WHERE 절을 사용하여 조인하지, 조인

    SQL NOT IN () 위험

    create table mStatus
    (   id int auto_increment primary key,
        status varchar(10) not null
    );
    insert mStatus (status) values ('single'),('married'),('divorced'),('widow');
    
    create table people
    (   id int auto_increment primary key,
        fullName varchar(100) not null,
        status varchar(10)  null
    );
    

    구리 ँ K 1 :

    truncate table people;
    insert people (fullName,`status`) values ('John Henry','single');
    select * from mstatus where `status` not in (select status from people);
    

    ** 3 행, 예상대로 **

    Chunk2 :

    truncate table people;
    insert people (fullName,`status`) values ('John Henry','single'),('Kim Billings',null);
    select * from mstatus where status not in (select status from people);
    

    행이, 허하지?

    물론이 '잘못'입니다. 그것은 3 치 논리의 SQL의 사용에서 발생 NULL의 존재에 의해 구동이 아닌 값이 누락 (또는 UNKNOWN) 정보를 나타낸다. NOT IN, Chunk2으로는 다음과 같이 번역된다 :

    status NOT IN ('married', 'divorced', 'widowed', NULL)
    

    이것은 동일합니다 :

    NOT(status='single' OR status='married' OR status='widowed' OR status=NULL)
    

    3 치 논리의 규칙에 따라 표현은 "상태 = NULL"UNKNOWN으로 평가하고, NOT UNKNOWN는 UNKNOWN으로 평가합니다. 그 결과, 모든 행이 필터링되고 쿼리는 빈 집합을 반환합니다.

    가능한 해결책은 다음과 같습니다 :

    select s.status
    from mstatus s
    left join people p
    on p.status=s.status
    where p.status is null
    

    또는 사용하지 존재

  2. ==============================

    2.이 문제를 해결하기 위해 조인 사용해보십시오

    이 문제를 해결하기 위해 조인 사용해보십시오

    select g.*, e.*,c.* from
          grade g inner join evaluation e on
          g.ID_COURSES <> e.ID_COURSES and g.year <> e.year
          inner join COURSE c on c.ID_COURSES = g.ID_COURSES
          ;
    
  3. from https://stackoverflow.com/questions/32175497/mysql-not-in-query-3-tables by cc-by-sa and MIT license