SQL Server如何在一个语句中更新两个表?
在 SQL 中,需要单个查询/语句同时执行 2 个任务。例如,在单个查询/语句中同时更新 2 个不同的表。这涉及到使用BEGIN TRANSACTION子句和COMMIT子句。单独的UPDATE子句写在前一个子句之间,以同时执行两个更新。下面的文章中描述了相同的内容。对于本文,我们将使用 Microsoft SQL Server 作为我们的数据库。
第 1 步:创建数据库。为此,请使用以下命令创建一个名为 GeeksForGeeks 的数据库。
询问:
CREATE DATABASE GeeksForGeeks
输出:
第 2 步:使用 GeeksForGeeks 数据库。为此,请使用以下命令。
询问:
USE GeeksForGeeks
输出:
第 3 步:在 GeeksForGeeks 数据库中创建一个表 ECONOMICS_MARKS。该表有 ID、S_NAME 和 ECO_MARKS 3 列,分别包含学生的卷号和姓名以及学生在经济学科目中的得分。
询问:
CREATE TABLE ECONOMICS_MARKS(
ID INT,
S_NAME VARCHAR(10),
ECO_MARKS INT);
输出:
第 4 步:描述表 ECONOMICS_MARKS 的结构。
询问:
EXEC SP_COLUMNS ECONOMICS_MARKS;
输出:
第 5 步:在 GeeksForGeeks 数据库中创建一个表 COMMERCE_MARKS。该表有 3 列,即 ID、S_NAME 和 COM_MARKS,分别包含学生的卷号和姓名以及学生在商科的分数。
询问:
CREATE TABLE COMMERCE_MARKS(
ID INT,
S_NAME VARCHAR(10),
COM_MARKS INT);
输出:
第 6 步:描述表 COMMERCE_MARKS 的结构。
询问:
EXEC SP_COLUMNS COMMERCE_MARKS;
输出:
第 7 步:在 ECONOMICS_MARKS 表中插入 5 行。
询问:
INSERT INTO ECONOMICS_MARKS VALUES(1,'SAM',70);
INSERT INTO ECONOMICS_MARKS VALUES(2,'AMY',68);
INSERT INTO ECONOMICS_MARKS VALUES(3,'EMMA',69);
INSERT INTO ECONOMICS_MARKS VALUES(4,'ROB',57);
INSERT INTO ECONOMICS_MARKS VALUES(5,'KEVIN',65);
输出:
步骤 8:显示 ECONOMICS_MARKS 表的所有行。
询问:
SELECT * FROM ECONOMICS_MARKS;
输出:
第 9 步:在 COMMERCE_MARKS 表中插入 5 行。
询问:
INSERT INTO COMMERCE_MARKS VALUES(1,'SAM',80);
INSERT INTO COMMERCE_MARKS VALUES(2,'AMY',88);
INSERT INTO COMMERCE_MARKS VALUES(3,'EMMA',90);
INSERT INTO COMMERCE_MARKS VALUES(4,'ROB',75);
INSERT INTO COMMERCE_MARKS VALUES(5,'KEVIN',56);
输出:
第 10 步:显示 COMMERCE_MARKS 表的所有行。
询问:
SELECT * FROM COMMERCE_MARKS;
输出:
步骤 11:使用单个查询将id=1的学生的经济学和商业标记分别更新为80和75 。这涉及 2 个步骤。首先,执行ECONOMICS_MARKS表和COMMERCE_MARKS表的JOIN 。然后分别使用表E和C的别名,比较学生的ID (以确保从两个表中选择相同的ID ) ,最后将学生ID与1 (给定值)进行比较。当这两个条件都满足时,将相应的标记更新为80和75 。整个事情必须包含在BEGIN TRANSACTION和COMMIT之间,以将其视为单个ATOMIC操作。此查询涉及更新属于相同学生 ID的记录。
句法:
BEGIN TRANSACTION;
UPDATE TABLE_1
SET TABLE_1.TABLE_1_COLUMN = VALUE_1
FROM TABLE_1 T1, TABLE_2 T2
WHERE T1.ID = T2.ID
AND T1.ID = ID_VALUE_1;
UPDATE TABLE_2
SET TABLE_2.TABLE_2_COLUMN = VALUE_2
FROM TABLE_1 T1, TABLE_2 T2
WHERE T1.ID = T2.ID
AND T2.ID = ID_VALUE_2;
COMMIT;
询问:
BEGIN TRANSACTION;
UPDATE ECONOMICS_MARKS
SET ECONOMICS_MARKS.ECO_MARKS = 80
FROM ECONOMICS_MARKS E, COMMERCE_MARKS C
WHERE E.ID = C.ID
AND E.ID = 1;
UPDATE COMMERCE_MARKS
SET COMMERCE_MARKS.COM_MARKS = 75
FROM ECONOMICS_MARKS E, COMMERCE_MARKS C
WHERE E.ID = C.ID
AND C.ID = 1;
COMMIT;
输出:
第 12 步:显示更新后的 ECONOMICS_MARKS 表的所有行。
询问:
SELECT * FROM ECONOMICS_MARKS;
注– ID 1的ECO_MARKS列的值更新为80 。
输出:
第 13 步:显示更新后的 COMMERCE_MARKS 表的所有行。
询问:
SELECT * FROM COMMERCE_MARKS;
注意: ID 1的COM_MARKS列的值更新为75 。
输出:
第 14 步:使用单个查询将id=2的学生的经济学标记更新为86 ,将id=3的学生的商业标记更新为99 。此查询涉及更新属于不同学生 ID的记录。
询问:
BEGIN TRANSACTION;
UPDATE ECONOMICS_MARKS
SET ECONOMICS_MARKS.ECO_MARKS = 86
FROM ECONOMICS_MARKS E, COMMERCE_MARKS C
WHERE E.ID = C.ID
AND E.ID = 2;
UPDATE COMMERCE_MARKS
SET COMMERCE_MARKS.COM_MARKS = 99
FROM ECONOMICS_MARKS E, COMMERCE_MARKS C
WHERE E.ID = C.ID
AND C.ID = 3;
COMMIT;
输出:
第 15 步:显示更新后的 ECONOMICS_MARKS 表的所有行。
询问:
SELECT * FROM ECONOMICS_MARKS;
注– ID 2的ECO_MARKS列的值已更新为86 。
输出:
第 16 步:显示更新后的 COMMERCE_MARKS 表的所有行。
询问:
SELECT * FROM COMMERCE_MARKS;
注– ID 3的COM_MARKS列的值更新为99 。
输出: