2013-11-24 41 views
1

我是学习SQL Server的学生,并使用管理工作室规范化作为单个表启动的数据库。如何使用INSERT INTO SELECT将lookup_id从Table1复制到Table2

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

表2列出了使用SELECT DISTINCT创建的所有CategoryDe​​scriptions和DescriptionID列。它有大约100行。

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

下产生预期的数据(80000个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的列。我认为也许这是问题,但是当我添加一个(并验证了相同的数据类型)时,我得到了同样的错误。

+0

可以尝试命名表和列多一点描述性。哦,并摆脱下划线! –

+0

当然。他们是以这种方式开始的,但是我认为如果我使它们更通用(如所建议的那样)会更有用。下划线是从我所关注的例子中复制而来,但我明白你的观点。使打字变得更加困难。 –

回答

0

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

你可以这样做:

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 

一些阅读上topicon MSDN - UPDATE syntax

+0

谢谢。这很好,但是你正在介绍对我来说是新的语法,我不明白。
SET TEST.dbo.MainTable.Con_ID = *** C.Con_ID *** FROM TEST.dbo.MainTable *** T ***同样使用*** C ***和*** C.Con_Name ***如果你能指出我正确的方向来理解这些,我将不胜感激。 (我仍然在计算如何评论!!) –

+0

添加了MSDN上相关部分的链接。 – Szymon

+0

好吧 - 我只是读了Alias的,虽然你的语法没有使用AS,但我可以看到它必须被推断出来。此外,您可以在定义之前使用别名! –

相关问题