Использование РЕГИСТРА ДЛЯ разных таблиц

#sql

#sql

Вопрос:

У меня есть несколько таблиц, которые выглядят как

 SQL> select * from stipend
2 order by subjectid, stipdate;

SUBJECTID  STIPDATE     AMOUNT
---------- ----------- ----------
10011    31-oct-2021    800
10111    31-jul-2019    2000
10111    31-jul-2021    1500
20022    31-jul-2020    1200
30033    29-feb-2020    1400
40044.   31-jul-2020    1200
40044    31-jul-2021    2000
50055    31-jul-2021    2000
50055    30-sep-2021    1000


SQL> select * from subject
  2  order by subjectid;

 SUBJECTID LNAME    FNAME      PROJID
---------- ------------ --------------------
     10011 Indy     Eva         XYZ01
     10111 Isner    Monica      XYZ04
     11011 Dupont   Marty       XYZ05
     20022 Jordan   Sam         XYZ01
     30033 Jordan   Mary        XYZ01
     40044 Belmont  Renee       XYZ02
     50055 Pissaro  Becky       XYZ02
     60066 Nadal    Becky       XYZ03
     70077 Bardot   Brigitte    XYZ03
     80088 null     Eva         XYZ03
     90099 Garnet   Larry       XYZ04
 

И я хочу обновить стипендии, которые есть в проектах XYZ01 и XYZ02, на 40%, используя CASE WHEN construct. Очевидно, что две таблицы соединены с помощью stipend.subjectid = subject.subjectid и я бы использовал subject.projectid для определения этого, но как мне это сделать с CASE WHEN ?

Комментарии:

1. Являются ли XYZ01 и XYZ02 единственными двумя идентификаторами проекта, которые вы заинтересованы в обновлении?

2. Если вы найдете приведенные ниже ответы полезными, отметьте их.

3. Я буду, я просто не нашел тот, который работает.

4. Какую СУБД вы используете?

Ответ №1:

Вы пробовали это?

 SELECT 
SUBJECTID
,PROJID
,CASE WHEN ProjectID in ('XYZ01','XYZ02') THEN AMOUNT * 1.4 ELSE AMOUNT END as AMOUNT
FROM subject sb
LEFT JOIN  stipend st ON st.SUBJECTID = sb.SUBJECTID
 

Комментарии:

1. Это не совсем сработало…

Ответ №2:

Вы можете попробовать это. Здесь я использовал таблицу стипендий в качестве LEFT таблицы, вы можете изменить это:

 SELECT 
st.SUBJECTID, sb.PROJID, Amount,
  CASE WHEN ProjID in ('XYZ01','XYZ02') THEN AMOUNT * 1.4 
       ELSE AMOUNT 
  END as Updated_AMOUNT
FROM stipend st 
LEFT JOIN  subject sb
   ON st.SUBJECTID = sb.SUBJECTID
 

Примечание: использование subject в качестве левой таблицы может привести к другому уровню. Попробуйте их в демонстрационной ссылке ниже.

ДЕМОНСТРАЦИЯ

Ответ №3:

Пожалуйста, проверьте это. У меня нет данных, поэтому я их не тестировал.

MySQL:

 UPDATE
  stipend st
  join subject sub on st.SUBJECTID = sub.SUBJECTID
SET
  AMOUNT = CASE WHEN 
  sub.ProjectID in ('XYZ01', 'XYZ02') 
  THEN AMOUNT * 1.4 
  ELSE AMOUNT 
  END
 

Oracle

Я думаю, SQL Plus имеет аналогичный синтаксис Oracle DB, вы можете попробовать это

Note: This syntax is converted online by https://www.sqlines.com/online . Pls check it

 UPDATE
  stipend st
  join subject sub on st.SUBJECTID = sub.SUBJECTID
  AMOUNT := CASE WHEN 
  sub.ProjectID in ('XYZ01', 'XYZ02') 
  THEN AMOUNT * 1.4 
  ELSE AMOUNT 
  END
 

Комментарии:

1. Это не совсем сработало. в нем говорилось, что мне не хватает ключевого слова SET и помечена строка темы соединения.

2. какой sql вы используете?? Я написал эту команду в соответствии с MySQL. И эта команда предназначена для обновления количества учащихся с учащимися с заданным проектом, если. Вы хотите обновить таблицу?

3. Я использую sqlplus, я думаю

4. присоединиться к теме на стипендию.subjectid = subject.subjectid * ОШИБКА в строке 2: ORA-00971: отсутствует ключевое слово SET

Ответ №4:

Лучше использовать обычное соединение, так как левое соединение приведет к появлению повторяющихся значений в вашем результате.

 
UPDATE STPIEND SET AMOUNT = CASE WHEN T1.AMOUNT IN ('XYZ01','XYZ02') THEN T1.AMOUNT * 1.4
ELSE T1.AMOUNT
END AS UPDATED_AMOUNT
FROM STIPEND T1 JOIN SUBJECT T2 ON T1.SUBJETID = T2.SUBJETID
 

Комментарии:

1. вы пробовали это? Как выглядит ваш o / p

2. Специфичный для продукта ответ на вопрос, в котором не указана СУБД. По крайней мере, скажите нам, для какой СУБД это предназначено.