sql - 根据插入的 ID 和 SQL 中的另一个非源列更新记录

标签 sql sql-server sql-update sql-insert insert-update

可能已经有答案了,但我找不到它......所以我有 2 个表和第三个表中的数据。让我们为它们命名(源、目标和更新目标)。

我需要将记录从源插入到目标,然后从目标获取自动增量 ID,并根据源表中的过滤器使用这些 ID 更新 UpdateTarget 表。我尝试使用 OUTPUT,但它给了我一个错误:

The multi-part identifier "s.EmployeeID" could not be bound.

这是我当前的 SQL 查询:

CREATE TABLE dbo.target
(
    id INT IDENTITY(1,1) PRIMARY KEY,
    employee VARCHAR(32)
);

CREATE TABLE dbo.source
(
    id INT IDENTITY(1,1) PRIMARY KEY,
    employee VARCHAR(32),
    EmployeeID int
);

CREATE TABLE dbo.updateTarget
(
    id INT IDENTITY(1,1) PRIMARY KEY,
    ExternalID int
);

DECLARE @MyTableVar TABLE
(
    id INT,
    EmployeeID int
);

    INSERT dbo.target (employee)
    OUTPUT 
        inserted.id, -- autoincremented ID
        s.EmployeeID -- here i got an error
        INTO @MyTableVar
    SELECT s.employee
    FROM dbo.source AS s

    UPDATE dbo.updateTarget
    SET ExternalID = data.ID
    FROM @MyTableVar data
    WHERE updateTarget.ID = data.EmployeeID


DROP TABLE source
DROP TABLE target
DROP TABLE updateTarget

我的目标表中没有 EmployeeID 列。

有没有办法在不为每条记录进行两次查询的情况下实现它?或者您能否指出现有的答案(如果有)?

谢谢!

最佳答案

1) INSERT INTO 表变量生成的 id 和用于更新的 EmployeeId

2) MERGE 而不是 INSERT(它允许从 SRC 获取列 EmployeeId)

3) 输出结果,插入操作,从 TGT 和 EmployeeId 获取 id

INSERT INTO @MyTableVar(id, EmployeeId)
SELECT id, EmployeeId 
FROM (
    MERGE dbo.target TGT
    USING dbo.source SRC
    ON TGT.employee = SRC.employee
    WHEN NOT MATCHED THEN
       INSERT (employee)
       VALUES (src.employee)
    OUTPUT inserted.id, SRC.EmployeeId)
AS out(id, EmployeeId);;

MERGE gives better OUTPUT options

关于sql - 根据插入的 ID 和 SQL 中的另一个非源列更新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32125738/

相关文章:

sql-server - 如何取消处于已创建执行状态的 SSIS 作业

mysql - 表为 'read only'

mysql - 如何在 MySQL 中使用 ALTER 将 VARCHAR 类型更改为 DATETIME?

SQL 查询选择今天和前一天的价格

mysql - 编写 SQL 查询以使用过滤器返回结果

sql - 如何计算一段时间内的数字 ID

sql - 无法使用 sqlproj 创建图表

mysql - 需要帮助在 mysql 中使用 if 条件和自动增量编写此更新查询

sql - 编写 Postgres 获取或创建 SQL 查询

sql - 选择最近的行,优化 (Oracle SQL)