Con*_*ngo 5 sql sql-server-2008
我想将现有表格转换为第一范式(最简单的规范化可能;参见示例).
你碰巧知道T-SQL是针对这类问题的吗?非常感谢!

更新
尝试下面的答案,它完美地工作.以下是我用来测试答案的步骤:
在上述情况下,@ Thomas具有完美可行的解决方案。但是,有时人们会为了提出问题而简化,因此,如果您需要转到多个表(或者第一个表对名称没有唯一的约束),我将解决您可能想做的事情二。
首先,我将数据插入到临时表中,并为id添加一列,该列将为null。然后,我将使用OUTPUT子句将插入操作写入父表,以将ID和自然键输出到表变量。然后,我将使用table变量来更新登台表中的id字段。然后,我将记录从登台表插入到其他表。由于我现在在那里有ID,因此不再需要访问原始父表。(如果记录数量很多,我可能还会索引登台表)。
现在,如果您没有自然键,则过程将变得更加困难,因为您将无法确定哪个记录归谁所有。然后,我通常将一个标识添加到登台表中,然后一次将父记录一次导入到父表中(包括将stagingtableid作为游标中的变量),然后按原样使用每个父表ID更新登台表。创建。更新所有初始记录后,我将使用基于集合的过程来插入或更新其他表。
临时表还使您有机会在尝试将任何不良数据放入生产表之前在本地修复这些不良数据。
您可能需要了解的其他语法是:MERGE语句是复杂的事情还是重复的过程。如果是新记录,则将插入;如果是现有记录,则将更新。
如果这是一个非常复杂的转换,则可以考虑使用SSIS。
从客户表开始
INSERT INTO Customer (Name)
SELECT DISTINCT Name
FROM Flat_CSV_File
Run Code Online (Sandbox Code Playgroud)
如果您有重复导入
INSERT INTO Customer (Name)
SELECT DISTINCT f.Name
FROM Flat_CSV_File f
LEFT OUTER JOIN Customer c ON f.Name = c.Name
WHERE c.Id IS NULL
Run Code Online (Sandbox Code Playgroud)
Orders(你的表名Order是TSQL中的保留字,所以需要用方括号括起来)
INSERT INTO [Order] (CustomerId, Description, Cost)
SELECT c.Id, f.Description, f.Cost
FROM Flat_CSV_File f
INNER JOIN Customer c ON f.Name = c.Name
Run Code Online (Sandbox Code Playgroud)