在不遍历游标的情况下将行从另一个 table 插入到 table
Inserting rows into a table from another table without iterating over a cursor
我有以下 tables,Robot 和 RobotTestResult。我想将Robot中的DateTested字段迁移到对应Robot的RobotTestResult中的DateTested字段。
Robot RobotTestResult
-------- ---------------
RobotID RobotTestID (Identity)
DateTested RobotID
DateTested
任何机器人的 RobotTestResult table 中最多有 1 个条目
有些机器人在 RobotTestResult 中会有相应的条目 table,我可以通过简单的连接更新这些值:
UPDATE RTR
SET RTR.DateTested = r.DateTested
FROM [dbo].[RobotTestResult] RTR
JOIN [Robot] r
ON RTR.RobotID = r.RobotID;
问题出在 RobotTestResult table 中没有条目的机器人。我能想到的唯一方法是使用 Cursor 遍历每个没有 RTR 条目的 Robot 并进行插入,但我觉得必须有更有效的方法。
编辑添加:如果 Robot 中不存在 DateTested 值,则不应插入 RobotTestResult。
快速而肮脏的解决方案。基本上,如果左连接找不到匹配项,则将值添加到 RobotTestResults
INSERT INTO RobotTestResults
(RobotID,DatedTest)
SELECT RobotID,DateTest
FROM Robot r
LEFT JOIN RobotTestRules rtr on rtr.robotID = r.robitID
WHERE rtr.robotID is NULL
我更喜欢在这种情况下使用 NOT EXISTS
,因为它符合问题的逻辑。
INSERT INTO RobotTestResults (RobotID, DatedTest)
SELECT RobotID, DateTest
FROM Robot R
WHERE DateTest IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM RobotTestRules RTR
WHERE RTR.RobotID = R.RobotID
)
我们也可以使用 MERGE 语句实现同样的效果。我个人喜欢@Dale K 解决方案。但是,将其添加为 TSQL 中的附加选项。
MERGE [dbo].[RobotTestResult] as tgt
USING (SELECT * FROM Robot) AS src
ON tgt.RobotID = src.RobotID AND src.DateTested IS NOT NULL
WHEN MATCHED THEN
UPDATE SET DateTested = src.DateTested
WHEN NOT MATCHED THEN
INSERT (RobotID, DateTested)
VALUES (src.RobotID, src.DateTested);
我有以下 tables,Robot 和 RobotTestResult。我想将Robot中的DateTested字段迁移到对应Robot的RobotTestResult中的DateTested字段。
Robot RobotTestResult
-------- ---------------
RobotID RobotTestID (Identity)
DateTested RobotID
DateTested
任何机器人的 RobotTestResult table 中最多有 1 个条目
有些机器人在 RobotTestResult 中会有相应的条目 table,我可以通过简单的连接更新这些值:
UPDATE RTR
SET RTR.DateTested = r.DateTested
FROM [dbo].[RobotTestResult] RTR
JOIN [Robot] r
ON RTR.RobotID = r.RobotID;
问题出在 RobotTestResult table 中没有条目的机器人。我能想到的唯一方法是使用 Cursor 遍历每个没有 RTR 条目的 Robot 并进行插入,但我觉得必须有更有效的方法。
编辑添加:如果 Robot 中不存在 DateTested 值,则不应插入 RobotTestResult。
快速而肮脏的解决方案。基本上,如果左连接找不到匹配项,则将值添加到 RobotTestResults
INSERT INTO RobotTestResults
(RobotID,DatedTest)
SELECT RobotID,DateTest
FROM Robot r
LEFT JOIN RobotTestRules rtr on rtr.robotID = r.robitID
WHERE rtr.robotID is NULL
我更喜欢在这种情况下使用 NOT EXISTS
,因为它符合问题的逻辑。
INSERT INTO RobotTestResults (RobotID, DatedTest)
SELECT RobotID, DateTest
FROM Robot R
WHERE DateTest IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM RobotTestRules RTR
WHERE RTR.RobotID = R.RobotID
)
我们也可以使用 MERGE 语句实现同样的效果。我个人喜欢@Dale K 解决方案。但是,将其添加为 TSQL 中的附加选项。
MERGE [dbo].[RobotTestResult] as tgt
USING (SELECT * FROM Robot) AS src
ON tgt.RobotID = src.RobotID AND src.DateTested IS NOT NULL
WHEN MATCHED THEN
UPDATE SET DateTested = src.DateTested
WHEN NOT MATCHED THEN
INSERT (RobotID, DateTested)
VALUES (src.RobotID, src.DateTested);