Обновить, где пара значений совпадает в SQL - PullRequest
0 голосов
/ 21 марта 2019

Мне нужно обновить эту таблицу:

Центры:

+-----+------------+---------+--------+
|  id |  country   | process | center |
+-----+------------+---------+--------+
|  1  |     1      |    1    |   1    |
|  2  |     1      |    2    |   1    |
|  3  |     1      |    3    |   1    |
|  4  |     2      |    1    |   1    |
|  5  |     2      |    2    |   1    |
|  6  |     2      |    3    |   1    |
|  7  |     3      |    1    |   1    |
|  8  |     3      |    2    |   1    |
|  9  |     3      |    3    |   1    |
+-----+------------+---------+--------+

Во время процесса выбора я получаю две таблицы tempTable:

TempCountries:

+-----+------------+
|  id |  country   |
+-----+------------+
|  1  |     1      |
|  2  |     3      |
+-----+------------+

И TempProcesses:

+-----+------------+
|  id |  process   |
+-----+------------+
|  1  |     2      |
|  2  |     3      |
+-----+------------+

В подзапросе я получаю все возможные комбинации значений:

SELECT TempCountries.countryId, TempProcesses.processesId FROM TempCenterCountries,TempCenterProcesses

Это возвращает:

+-----+------------+---------+
|  id |  country   | process |
+-----+------------+---------+
|  1  |     1      |    2    |
|  2  |     1      |    3    |
|  3  |     3      |    2    |
|  4  |     3      |    3    |
+-----+------------+---------+

Во времяВ процессе выбора пользователь выбирает центр для этих комбинаций.Допустим, center = 7. Теперь мне нужно обновить значение center в таблице Centers, где присутствуют комбинации подзапроса.

Итак,

UPDATE Centers SET center = 7 WHERE ?

Итак, я получаю:

+-----+------------+---------+--------+
|  id |  country   | process | center |
+-----+------------+---------+--------+
|  1  |     1      |    1    |   1    |
|  2  |     1      |    2    |   7    |
|  3  |     1      |    3    |   7    |
|  4  |     2      |    1    |   1    |
|  5  |     2      |    2    |   1    |
|  6  |     2      |    3    |   1    |
|  7  |     3      |    1    |   1    |
|  8  |     3      |    2    |   7    |
|  9  |     3      |    3    |   7    |
+-----+------------+---------+--------+

Ответы [ 4 ]

1 голос
/ 21 марта 2019

Не все реализации sql позволяют использовать предложение from при использовании update. К счастью, в вашем случае, поскольку вы используете декартово произведение для получения всех комбинаций, это означает, что между двумя значениями нет никаких ограничений.

UPDATE  Centers
SET center = 7
WHERE   country IN (SELECT countryId FROM TempCountries)
AND process IN (SELECT processId FROM TempCenterProcesses)
1 голос
/ 21 марта 2019

Попробуйте, если это стандартный sql,

Update Centers
set center = 7
where country in (select country from TempCenterCountries)
   and process in (select process from TempCenterProcesses)
0 голосов
/ 21 марта 2019

Использовать обновление соединения -

Для Sql Server

update c set SET center = 7 from Centers c
join
(SELECT TempCountries.countryId, TempProcesses.processesId FROM TempCenterCountries join TempCenterProcesses
)A on c.countryid=A.countryid and c.processesId=A.processId

Для Mysql -

    update Centers c  
    join
    (SELECT TempCountries.countryId, TempProcesses.processesId FROM TempCenterCountries join TempCenterProcesses
    )A on c.countryid=A.countryid and c.processesId=A.processId
    set SET center = 7
0 голосов
/ 21 марта 2019

Перед запуском запроса на обновление необходимо точно указать страну и процесс. Таким образом, что-то вроде запроса ниже поможет вам достичь этого. В основном обновите столбец, если существует запись

WITH (SELECT TempCountries.countryId, TempProcesses.processesId
FROM TempCenterCountries,
 TempCenterProcesses) AS TempTables,
UPDATE Centers
SET center = 7
WHERE EXISTS (SELECT 1
          FROM TempTables tmp
          WHERE country = tmp.countryId and process = tmp.processesId
         );

Идея состоит в том, чтобы обновить запись, если страна и процесс совпадают с той, которую вы уже выбрали во временной таблице.

...