Измените оператор MySQL INSERT, чтобы исключить вставку определенных строк

0

Я пытаюсь немного рассказать о заявлении о том, что я получил помощь на прошлой неделе. Как вы можете видеть, я создаю временную таблицу и вставляю строки данных студентов из недавно проведенного теста для нескольких десятков школ. Когда строки вставлены, они сортируются по счету (totpct_stu, от высокого к низкому), а row_number добавляется, причем 1 представляет наибольший балл и т.д.

Я узнал, что в школе № 9999 были проблемы в классе SMITH (каждый студент сделал отличную оценку, и они были единственными учениками в этом районе). Поэтому я не хочу импортировать класс SMITH.

Как вы можете видеть, я удалил класс SMITH, но это испортило нумерацию строк для оставшейся части ученика в школе (например, высокий балл row_number теперь равен 20, а не 1).

Как я могу изменить инструкцию INSERT, чтобы не вставлять этот класс?

DROP TEMPORARY TABLE IF EXISTS avgpct ;
CREATE TEMPORARY TABLE avgpct_1
   ( sch_code    VARCHAR(3),
     schabbrev   VARCHAR(75),
     teachername VARCHAR(75),
     totpct_stu  DECIMAL(5,1),
     row_number  SMALLINT,
     dummy       VARCHAR(75)
   );
-- ----------------------------------------
INSERT INTO avgpct
SELECT sch_code
     , schabbrev
     , teachername
     , totpct_stu
     , @num := IF( @GROUP = schabbrev, @num + 1, 1 ) AS row_number
     , @GROUP := schabbrev AS dummy
  FROM sci_rpt
 WHERE grade = '05' AND 
       totpct_stu >= 1   -- has a valid score
 ORDER 
    BY sch_code, totpct_stu DESC ;
-- ---------------------------------------
-- select * from avgpct ;
-- ---------------------------------------
DELETE 
  FROM avgpct_1
 WHERE sch_code = '9999' AND 
       teachername = 'SMITH' ;
Теги:
variables
temp-tables
insert

2 ответа

1
Лучший ответ
INSERT INTO avgpct
SELECT sch_code
     , schabbrev
     , teachername
     , totpct_stu
     , @num := IF( @GROUP = schabbrev, @num + 1, 1 ) AS row_number
     , @GROUP := schabbrev AS dummy
  FROM sci_rpt
 WHERE grade = '05' AND 
       totpct_stu >= 1   -- has a valid score
       AND NOT (sch_code = '9999' AND 
       teachername = 'SMITH')
 ORDER 
    BY sch_code, totpct_stu DESC ;
  • 0
    Ну, это понятно. Я попробовал следующее, но запрос стал воздушным и не остановился. Спасибо!
  • 0
    ... WHERE grade = '05' AND totpct_stu> = 1 AND NOT IN (выберите * из sci_rpt, где sch_code = '9999', а имя_участника = 'SMITH') ...
0

Что-то в этом направлении может работать. В тестовой среде измените это значение

WHERE grade = '05' AND 
       totpct_stu >= 1   -- has a valid score

к этому

WHERE grade = '05' AND 
       totpct_stu >= 1  AND NOT -- has a valid score
       (sch_code = '9999' AND teachername = 'SMITH')

Но, если бы я был вами, я бы ожидал, что исключения будут повторяющейся проблемой. Может быть, не часто, но регулярно повторяется. Это предложило бы основанный на таблицах подход - хранение вещей, которые должны быть исключены в таблице, а не "их хранение" в операторах SQL.

  • 0
    Спасибо! Да, пока я работаю над проектом типа "только один раз", но я согласен с вами.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню