代码之家  ›  专栏  ›  技术社区  ›  CheeseConQueso

Informix的自引用更新SQL语句

  •  2
  • CheeseConQueso  · 技术社区  · 16 年前

    需要一些Informix SQL…

    课程有固定的等级,但他们的相关实验室有“实验室”的等级。我需要更新表格,使实验室成绩与课程成绩相匹配。另外,如果实验室没有相应的课程,这意味着课程被取消。在这种情况下,我想为它的等级放置一个标记值“x”。

    更新前的示例数据:

       id     yr sess crs_no                  hrs grd
    
      725   2009 FA   COLL101      3.000000000000 C
      725   2009 FA   ENGL021      3.000000000000 FI
      725   2009 FA   ENGL021L     1.000000000000 LAB
      725   2009 FA   ENGL031      3.000000000000 FNI
      725   2009 FA   ENGL031L     1.000000000000 LAB
      725   2009 FA   MATH010      3.000000000000 FNI
      725   2010 SP   AOTE101      3.000000000000 C
      725   2010 SP   ENGL021L     1.000000000000 LAB
      725   2010 SP   ENGL031      3.000000000000 FI
      725   2010 SP   ENGL031L     1.000000000000 LAB
      725   2010 SP   MATH010      3.000000000000 FNI
      726   2010 SP   SPAN101      3.000000000000 FN
    

    更新后的示例数据:

       id     yr sess crs_no                  hrs grd
    
      725   2009 FA   COLL101      3.000000000000 C
      725   2009 FA   ENGL021      3.000000000000 FI
      725   2009 FA   ENGL021L     1.000000000000 FI
      725   2009 FA   ENGL031      3.000000000000 FNI
      725   2009 FA   ENGL031L     1.000000000000 FNI
      725   2009 FA   MATH010      3.000000000000 FNI
      725   2010 SP   AOTE101      3.000000000000 C
      725   2010 SP   ENGL021L     1.000000000000 X
      725   2010 SP   ENGL031      3.000000000000 FI
      725   2010 SP   ENGL031L     1.000000000000 FI
      725   2010 SP   MATH010      3.000000000000 FNI
      726   2010 SP   SPAN101      3.000000000000 FN
    

    我为此制定了一个解决方案,但它需要大量动态组合外键,这些外键是由ID、YR、SESS和SUBString'd CRS_no连接而成的。我的解决方案不仅是杀伤力过大,而且还存在漏洞,处理时间太长。

    我知道有一种更简单的方法可以做到这一点,但我已经走了这么远的路,以至于我很难想出一种不同的方法。

    3 回复  |  直到 14 年前
        1
  •  2
  •   CheeseConQueso    16 年前
    UPDATE          det_list 
    SET             grd = ( SELECT  c.grd 
                            FROM    cw_rec c 
                            WHERE   c.id = det_list.id 
                                    AND c.sess = det_list.sess 
                                    AND c.yr = det_list.yr 
                                    AND c.crs_no = substr(det_list.crs_no,0,7)
                                    AND stat NOT IN ('D','X') 
                                    AND hrs > 0 
                                    AND grd <> 'IP') 
                    WHERE grd = 'LAB';
    
        2
  •  0
  •   Anthony Faull    16 年前
    UPDATE lab
    SET grd = NVL(crs.grd, 'X')
    FROM Grades lab
    LEFT JOIN Grades crs
        ON crs.id = lab.id
        AND crs.yr = lab.yr
        AND crs.sess = lab.sess
        AND crs.crs_no || 'L' = lab.crs_no
    WHERE lab.grd = 'LAB'
    
        3
  •  0
  •   Joe R.    16 年前

    如果创建一个新列来保存每列的连接值,并为FK创建相同的列,那么复合键问题会更容易吗?…奶酪加奶酪,你有没有尝试过我为你的ACE报告提供的AM/PM时间编程代码?

    推荐文章