【问题标题】:How to copy lookup_id from Table1 to Table2 with INSERT INTO SELECT如何使用 INSERT INTO SELECT 将 lookup_id 从 Table1 复制到 Table2
【发布时间】:2013-11-24 04:02:57
【问题描述】:

我是一名学生,正在学习 SQL Server,并使用管理工作室来规范化从单个表开始的数据库。

我现在有 80,000 行的 Table1,其中包含 ID、CategoryDe​​scription 等...以及许多重复的 CateogoryDe​​scriptions。

Table2 有一个包含所有 CategoryDe​​scriptions 的列表和一个使用 SELECT DISTINCT 创建的 DescriptionID 列。它有大约 100 行。

我想将 Table2 中的 DescriptionID 值复制到表 1 中,以便删除大的 CategoryDe​​scription 列并将其替换为查找表的链接。

以下生成预期数据(单列 80,000 个 id):

SELECT TEST.dbo.LU_ConNames.Con_ID
FROM TEST.dbo.LU_ConNames
JOIN TEST.dbo.MainTable
ON TEST.dbo.MainTable.CONCESSION = TEST.dbo.LU_ConNames.Con_Name

但是,当我添加 INSERT INTO...

INSERT INTO TEST.dbo.MainTable
SELECT TEST.dbo.LU_ConNames.Con_ID
FROM TEST.dbo.LU_ConNames
JOIN TEST.dbo.MainTable
ON TEST.dbo.MainTable.CONCESSION = TEST.dbo.LU_ConNames.Con_Name

我得到“列名或提供的值的数量与表定义不匹配。”澄清一下,MainTable 中没有名为 Con_ID 的列。我认为这可能是问题所在,但是当我添加一个(并验证相同的数据类型)时,我得到了同样的错误。

【问题讨论】:

  • 你能不能试着给你的表和列命名更详细一点。哦,去掉下划线!
  • 当然。他们是这样开始的,但我认为如果我让它们更通用(如建议的那样)会更有用。下划线是从我正在遵循的示例中复制的,但我明白你的意思。让打字更难。

标签: sql sql-server


【解决方案1】:

您不应该插入新记录,因为您想更新现有记录。

你可以这样做:

UPDATE TEST.dbo.MainTable
SET TEST.dbo.MainTable.Con_ID = C.Con_ID
FROM TEST.dbo.MainTable T
INNER JOIN TEST.dbo.LU_ConNames C
ON T.CONCESSION = C.Con_Name

关于该主题的一些阅读MSDN - UPDATE syntax

【讨论】:

  • 谢谢。这很好用,但是您介绍的语法对我来说是新的,我不明白。
    SET TEST.dbo.MainTable.Con_ID = C.Con_ID FROM TEST.dbo.MainTable T 同样,您使用 CC.Con_Name 如果您能指出正确的方向,我将不胜感激了解这些。 (我还在想怎么评论!!)
  • 在 MSDN 上添加了相关部分的链接。
  • 好的 - 我刚刚阅读了 Alias 的内容,虽然您的语法不使用 AS,但我可以看到它必须被推断出来。此外,您可以在定义之前使用别名!
  • 是的,AS 是可选的。即使您使用SELECT T.column from table1 T,您也可以这样使用别名。
猜你喜欢
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
  • 2020-08-14
  • 2014-02-10
  • 2021-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多