更新值对在SQL中匹配的位置

时间:2019-03-21 08:56:10

标签: sql where updates

我需要更新此表:

中心:

+-----+------------+---------+--------+
|  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    |
+-----+------------+---------+--------+

在选择过程中,我检索了两个临时表:

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。 现在,我需要更新存在子查询组合的“中心”表中的中心值。

所以

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 个答案:

答案 0 :(得分:1)

尝试使用此标准sql

Update Centers
set center = 7
where country in (select country from TempCenterCountries)
   and process in (select process from TempCenterProcesses)

答案 1 :(得分:1)

并不是所有的sql实现都允许您在使用update时使用from子句。在您的情况下,幸运的是,由于要进行所有组合的笛卡尔乘积运算,这意味着在两个值之间没有任何约束。

UPDATE  Centers
SET center = 7
WHERE   country IN (SELECT countryId FROM TempCountries)
AND process IN (SELECT processId FROM TempCenterProcesses)

答案 2 :(得分:0)

在运行更新查询之前,您需要准确匹配国家和流程。因此,类似下面的查询将帮助您实现这一目标。如果有记录,基本上更新列

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
         );

想法是如果国家和流程都与您已经在临时表中获取的记录相匹配,则更新记录。

答案 3 :(得分:0)

使用更新联接-

对于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