Измените оператор MySQL INSERT, чтобы исключить вставку определенных строк - PullRequest
0 голосов
/ 17 января 2011

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

Как вы можете видеть, я УДАЛЕН класс Смита, но это испортило нумерацию строк для оставшейся части ученика в школе (например, высокий счет row_number20, а не 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' ;

Ответы [ 2 ]

1 голос
/ 17 января 2011
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 голосов
/ 17 января 2011

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

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.

...