我正在将数据从旧的非关系型数据库迁移到新的关系型数据库结构中。我目前在一个不知道如何正确处理要插入到一个数据表中的数据的地方。
基本上,我有以下两个表:
Table: Contact
Contact_ID INT IDENTITY NOT NULL
First_Name VARCHAR(50) NULL
Last_Name VARCHAR(50) NULL
Company_ID INT NOT NULL
Table: Contact_Fax
Contact_ID INT NOT NULL
Fax_Num VARCHAR(20) NOT NULL
In_User BIT NOT NULL
现在以这种方式设置表,以便我们可以轻松地管理联系人以获取第二个传真号或获取新的传真号,同时保留旧信息以备不时之需。
我从中提取数据的表的数据布局如下:
Table: Company
Company_Name VARCHAR(100) NOT NULL
Contant VARCHAR(100) NULL
Address VARCHAR(100) NULL
City VARCHAR(100) NULL
Phone1 VARCHAR(20) NULL
Phone2 VARCHAR(20) NULL
Fax VARCHAR(20) NULL
现在,我已经能够将CSV文件放在一起以保存所需的数据,每个文件都有特定的列以与将要导入的表匹配:
CSV: Contact
First_Name
Last_Name
Company
CSV: Contact_Fax
First_Name
Last_Name
Company
Fax
我没有问题,可以从两个CSV文件中获取数据并将它们放入“临时表”中,以便我使用它们插入实际的数据库表中。但是对于我的传真表,当我将Temp表中的数据插入到实际表中时,并不是所有的数据都可以传输。这是我的SQL语句:
INSERT INTO Contact_Fax
SELECT Contact_ID, Fax, 1
FROM Con_Fax_Temp
INNER JOIN Contact ON Contact.First_Name = Con_Fax_Temp.First_Name
INNER JOIN Company ON Company.Company_Name = Con_Fax_Temp.Company_Name
WHERE Contacts.Company_ID = Company.Company_ID
我在这里到底在做什么错?
编辑:以下是CSV文件中数据的一些示例:
CSV: Contact
Mike,Langtry,LANGTRY BLAST TECHNOLOGIES INC.
Adrian,Stickland,Main,Connect Tech Inc
Todd,Corley,Main,Takata Seat Belts
CSV: Contact_Fax
Mike,Langtry,LANGTRY BLAST TECHNOLOGIES INC.,9056812814
Adrian,Stickland,Connect Tech Inc,5198364878
Todd,Corley,Takata Seat Belts,6147663628
EDIT2:所以当我描述我要完成的任务时我感到非常恐惧。
我正在尝试将Contact_Fax
CSV中的数据插入到Contact_Fax
表中。现在,我上面在SQL中提到的Con_Fax_Temp
表看起来像这样:
Table: Con_Fax_Temp
First_Name VARCHAR(50) NOT NULL
Last_Name VARCHAR(50) NULL
Company_Name VARCHAR(75) NOT NULL
Fax VARCHAR(25) NOT NULL
我的目标是使用Contact_Fax
表的Contact_ID
列作为外键,将CSV的每条记录插入到Contact
表中。要检查我是否具有正确的外键值,我想将First_Name
表中的Company_Name
和Con_Fax_Temp
列的值与First_Name
和{{1} Company_ID
表中的}列。
注意::Contact
表具有外键Contact
,这就是为什么我在Company_ID
表上具有Join以便可以引用{与每个Company
我希望我能对此做更好的解释> _ << / p>
答案 0 :(得分:2)
就像我在评论中说的那样,您似乎在这里拥有一些相当粗略的体系结构。而且您的联接逻辑非常脆弱。如果您的公司中托德超过1个,会发生什么?加入这样的名字很可能会在某个时候中断。
但是,如果我了解您要执行的操作(除了逻辑问题),您的查询将类似于以下内容。注意,我为插入指定了列。您应该总是这样做。另外,我为每个列都包含了表别名,因此您可以确切地知道每个数据点来自哪个表。
INSERT INTO Contact_Fax
(
Contact_ID
, Fax_Num
, In_User
)
SELECT con.Contact_ID
, cft.Fax
, 1
FROM Con_Fax_Temp cft
INNER JOIN Company c ON c.Company_Name = cft.Company_Name
INNER JOIN Contact con ON con.First_Name = cft.First_Name
AND con.Company_Name = cft.Company_Name
AND con.Company_ID = c.Company_ID