У меня 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"
проблема заключается в том, что имя john не находится в оценке таблицы, тогда нет выхода.
Избегайте NOT IN
как чума, если
SELECT ID_Courses FROM Evaluation where `NAME`='JOHN' and Year=1
может когда-либо содержать NULL. Вместо этого используйте NOT EXISTS или Left Joins
использовать явные объединения, а не стиль стиля 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 );
блок 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);
нет строк, да?
Очевидно, что это «неверно». Это связано с использованием 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)
Выражение «status = 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
или использовать not exists
Попробуйте использовать соединения для решения этой проблемы.
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 ;