Вставка строк в таблицу из другой таблицы без перебора курсора - PullRequest
0 голосов
/ 10 июля 2020

У меня есть следующие таблицы: Robot и RobotTestResult. Я хочу перенести поле DateTested в Robot в поле DateTested в RobotTestResult для соответствующего робота.

Robot         RobotTestResult
--------      ---------------
RobotID       RobotTestID (Identity)
DateTested    RobotID
              DateTested

В таблице RobotTestResult будет не более 1 записи для любого робота

Некоторые У роботов будет соответствующая запись в таблице RobotTestResult, я могу обновить эти значения с помощью простого соединения:

UPDATE RTR
SET RTR.DateTested = r.DateTested
FROM [dbo].[RobotTestResult] RTR
JOIN [Robot] r
ON RTR.RobotID = r.RobotID;

Проблема связана с роботами, у которых нет записи в таблице RobotTestResult. Единственный способ, который я могу придумать, - это использовать курсор для итерации по каждому роботу, у которого нет записи RTR, и выполнить вставку, но я чувствую, что должен быть более эффективный способ.

Изменить, чтобы добавить : Если в Robot нет значения DateTest, вставлять RobotTestResult не следует.

Ответы [ 3 ]

4 голосов
/ 10 июля 2020

Я предпочитаю использовать NOT EXISTS для этого сценария, поскольку он соответствует logi c проблемы.

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
    )
2 голосов
/ 10 июля 2020

Мы можем добиться того же, используя оператор MERGE. Мне лично нравится решение @Dale K. Но, добавив это как дополнительную опцию в T SQL.

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);
1 голос
/ 10 июля 2020

Быстрое и грязное решение. В основном, если левое соединение не находит совпадения, добавьте значение в 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
...