在不遍历游标的情况下将行从另一个 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);