Самостоятельно ссылающийся оператор SQL для Informix - PullRequest
2 голосов
/ 18 июня 2010

Нужно немного Informix SQL ...

Курсы получают обычную оценку, но их лаборатории получают оценку «LAB». Мне нужно обновить таблицу так, чтобы оценка лаборатории соответствовала оценке курса. Кроме того, если нет соответствующего курса для лаборатории, это означает, что курс был отменен. В этом случае я хочу поместить значение флага '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 ]

2 голосов
/ 18 июня 2010
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';
0 голосов
/ 19 июня 2010

Будет ли проблема составного ключа легче, если вы создадите новый столбец, который содержит объединенные значения каждого столбца и создаете тот же столбец для fk? .. Сыр с сыром, вы когда-нибудь пробовали код программирования времени AM / PM Я предоставил вам ваш отчет Ace?

0 голосов
/ 18 июня 2010
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'
...