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

Update where value pair matches in SQL

我需要更新这个 table:

中心:

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

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

临时国家:

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

和临时进程:

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

在子查询中,我得到所有可能的值组合:

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

这个returns:

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

在选择过程中,用户为这些组合选择一个中心。假设中心 = 7。 现在我需要更新中心 table 中的中心值,其中存在子查询的组合。

所以,

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

试试这个标准sql,

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

在 运行 更新查询之前,您需要精确匹配国家和流程。因此,类似以下查询的内容将帮助您实现这一目标。如果存在记录

,基本上更新列
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
         );

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

并非所有 sql 实现都允许您在使用更新时使用 from 子句。幸运的是,在你的情况下,因为你正在做笛卡尔积来获得所有组合,这意味着你在两个值之间没有任何约束。

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

使用更新连接 -

对于Sql服务器

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