不确定如何正确执行此SQL

时间:2018-06-22 19:10:55

标签: sql sql-server

我正在将数据从旧的非关系型数据库迁移到新的关系型数据库结构中。我目前在一个不知道如何正确处理要插入到一个数据表中的数据的地方。

基本上,我有以下两个表:

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_NameCon_Fax_Temp列的值与First_Name和{{1} Company_ID表中的}列。

注意:Contact表具有外键Contact,这就是为什么我在Company_ID表上具有Join以便可以引用{与每个Company

相关联的{1}}

我希望我能对此做更好的解释> _ << / p>

1 个答案:

答案 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