【问题标题】:How to insert a column from another table in T-SQL?如何在 T-SQL 中插入另一个表中的列?
【发布时间】:2021-08-30 10:05:15
【问题描述】:

我需要在不创建新视图/表的情况下合并两个表。基本上,我只需要将一列添加到取自另一个表的现有表中。

table1 看起来像这样:

table2 看起来像这样:

我需要一个看起来像table2 的表,但有一个额外的列:programs_total。如果第一列中没有这样的id,我希望第二列有NULL。在此示例中,我希望 id=72_200 的原始数据在 programs_total 列中具有 NULL

我尝试了以下脚本:

-- adding a new column 
ALTER TABLE table2
ADD programs_total BIGINT NULL;

-- inserting new data
INSERT INTO table2 (programs_total)
SELECT programs_total
FROM table1

但它会产生以下错误:

Msg 515, Level 16, State 2, Line 4
Cannot insert the value NULL into column 'id', table 'stb.dbo.table2'; column does not allow nulls. INSERT fails.
The statement has been terminated.

我想它会尝试插入三个新行,而不是将列与现有行连接起来。如何告诉它将列加入现有行?

或者我做错了什么?

【问题讨论】:

  • 好像你想要一个UPDATE 和一个JOIN,而不是一个INSERT。或者在`table1`中是否有值id的行没有出现在table2中?

标签: sql sql-server tsql ssms


【解决方案1】:

看起来你真的想要UPDATE

UPDATE t2
SET t2.total_programs = t1.total_programs
FROM dbo.table2 t2
     JOIN dbo.table1 t1 ON t2.id = t1.id;

但是,如果 table1 中的 id 值没有出现在 table2 中,并且您想将这些值插入到 table2 中,那么您将需要 MERGE

MERGE dbo.Table2 AS T2
USING dbo.TAble1 AS T1 ON T2.id = T1.id
WHEN MATCHED THEN
    UPDATE 
    SET total_programs = t1.total_programs
WHEN NOT MATCHED THEN
    INSERT (id,total_programs)
    VALUES(T1.id,T1.total_programs);

或者您可以将其写为 Upsert,如下所示:

UPDATE t2
SET t2.total_programs = t1.total_programs
FROM dbo.table2 t2
     JOIN dbo.table1 t1 ON t2.id = t1.id;

INSERT INTO dbo.Table2(id,total_programs)
SELECT t1.id,
       t1.total_programs
FROM dbo.Table1 t1
WHERE NOT EXISTS (SELECT 1
                  FROM dbo.Table2 t2
                  WHERE t2.id = t1.id);

【讨论】:

  • 谢谢,帮了大忙!
  • @Larnu 第二种解决方案,您自己滚动 Upsert 似乎更安全一些;就个人而言,在阅读了 Aaron Betrand 的以下内容后,我已经避免使用 MERGEmssqltips.com/sqlservertip/3074/…
【解决方案2】:

说明:您需要UPDATE,而不是INSERT。前者将添加一个 new 行,因此您对不可空列的错误

尝试以下测试,如果看起来不错,运行UPDATE 语句:

SELECT 
     t2.*
    ,table1.programs_total   /* new column*/
FROM table2 t2
LEFT OUTER JOIN table1 on t2.ID = table1.id  ;

更新:

UPDATE t2
SET total_programs = table1.programs_total
FROM table2 t2
LEFT OUTER JOIN table1 on t2.ID = table1.id  ;

【讨论】:

    【解决方案3】:

    首先您可以通过以下方式获取数据:

    SELECT 
        table2.id,
        table2.total_duration,
        table1.programs_total
    FROM
        table2
        LEFT JOIN table1
        ON table2.id = table1.id
    

    如果您需要将此数据作为新表,您可以像这样简单地添加一个 INTO:

    SELECT 
        table2.id,
        table2.total_duration,
        table1.programs_total
    INTO
        table3
    FROM
        table2
        LEFT JOIN table1
        ON table2.id = table1.id
    

    'table3' 是新表的名称。

    【讨论】:

    • OP 不想要一个新表,只是在表 2 中添加一个字段
    • 引用:“我需要一个看起来像 table2 的表”我认为我的解决方案适用于此。
    • 阅读第一行 - 无需创建新视图/表格。您的解决方案将找到正确的匹配项,尽管新对象似乎不是 OP 想要的东西
    • 啊,我错过了,很公平 - 我会留下我的答案以防万一它有帮助,但我可以根据 OP 的判断将其删除。
    • @HarryClark 仍然感谢您的回答!它真的可以解决我的问题,但 Larnu 的答案正是我想要的。让我们把你的答案留在这里,以防它对其他人有用。
    【解决方案4】:

    您需要更新该列:

    UPDATE table2 
    SET total_programs = B.total_programs
    FROM table1 A
    JOIN table2 B
    ON A.ID = B.ID
    

    【讨论】:

      【解决方案5】:

      感谢您提出如此详细的问题。您也可以使用子查询来更新 table2。

      update table2
      set programs_total=(select programs_total from table1 where table1.id=table2.id)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-24
        • 2021-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多