【问题标题】:Modify MySQL INSERT statement to omit the insertion of certain rows修改 MySQL INSERT 语句以省略某些行的插入
【发布时间】:2011-01-17 02:29:48
【问题描述】:

我正在尝试对上周获得帮助的声明进行一些扩展。如您所见,我正在设置一个临时表并插入来自最近为几十所学校管理的测试的学生数据行。插入行时,按分数排序(totpct_stu,从高到低)并加上row_number,1代表最高分数,以此类推。

我了解到,在 SMITH 的班级中,#9999 学校存在一些问题(每个学生都取得了满分,而且他们是学区唯一这样做的学生)。所以,我不想导入 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' ;

【问题讨论】:

    标签: mysql variables insert temp-tables


    【解决方案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 ;
    

    【讨论】:

    • 嗯,明白了。我尝试了以下方法,但是查询变成了空中并且不会停止。谢谢!
    • ...WHERE Grade = '05' AND totpct_stu >= 1 AND NOT IN (select * from sci_rpt where sch_code = '9999' and teachername = 'SMITH') ...
    【解决方案2】:

    类似的方法可能会奏效。在您的测试环境中,更改此项

    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 语句中。

    【讨论】:

    • 谢谢!是的,到目前为止,我正在从事“仅一次”类型的项目,但我同意你的看法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 2011-12-04
    • 1970-01-01
    相关资源
    最近更新 更多