Обновить столбец с указанными значениями c (если предложение) - PullRequest
1 голос
/ 24 апреля 2020

Я пытаюсь вставить новые значения в столбец спецификаций c с «обновлением таблицы наборов спецификаций c столбец ....» У меня есть две таблицы, подобные этой:

Таблица1

Name       Idnumber          Score 
JOHN         DB              10
JOHN         IT              NULL
KAL          DB              9
HENRY        KK              7
KAL          DB              10
HENRY        IP              9
ALI          IG              10
ALI          PA              9

Table2

NAME    |  MONEY |
-----------------|
JOHN    |        | 
-----------------|
KAL     |        |
-----------------|
HENRY   |        |
-----------------|
ALI     |        |
-----------------

И я хочу, чтобы моя таблица выглядела так:

Обновленная таблица

NAME    |  MONEY |
-----------------|
JOHN    |        | 
-----------------|
KAL     |   yes  |
-----------------|
HENRY   |   half |
-----------------|
ALI     |   yes  |
-----------------

Условие для записи "да" в деньги В столбце указано, что все оценки под одним и тем же именем в таблице 1 должны быть 9 или выше. Условие для написания «половины» должно быть не ниже 6 (я имею в виду, что оценки могут быть 10,9,8,7 и 6). )

Таким образом, в основном это означает, что, например, Генри не может быть выбран, и я не могу написать «да» рядом с его именем в обновленной таблице, потому что у него есть оценка ниже значения 9 в одной строке, но в другом он имеет 7 баллов (также должны быть выданы нулевые значения).

Я использую программу sas. Спасибо !!!

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Вы, похоже, воспринимаете NULL как значение, которое меньше "9". В стандарте SQL (который работает как в MySQL, так и в SAS, оригинальные теги):

update table2 t2
    set money = 'YES'
    where not exists (select 1 
                      from table1 t1
                      where t1.name = t2.name and coalesce(t1.score, 0) < 9
                     );

Если вы хотите гарантировать, что в table2 есть хотя бы одна строка, один метод такое агрегация:

update table2 t2
    set money = 'YES'
    where (select (case when sum(case when t1.score > 9 then 1 else 0 end) = count(*)
                        then count(*)
                   end)
           from table1 t1
           where t1.name = t2.name
          ) > 0
0 голосов
/ 24 апреля 2020

Вы можете попробовать следующий синтаксис:

update table2 
set money = 'YES'
where not exists (select 1 from table1 t1 where t1.name = table2.name and t1.score < 9)

Однако это также приведет к обновлению записей, которые не соответствуют в table1. В MySQL, один простой способ избежать, который использует join:

update table2 t2
inner join (select name, min(score) min_score from table1 group by name) t1
    on t1.name = t.name and t1.min_score >= 9
set t2.money = 'YES'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...