首页 > 解决方案 > 不确定如何正确执行此 SQL

问题描述

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

基本上我有以下两个表:

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 文件中获取数据并将它们放入临时表中,以便我用于插入到实际的数据库表中。然而,对于我的传真表,当我将临时表中的数据插入到实际表中时,并不是所有的数据都被传输了。这是我的 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_FaxCSV 中的数据插入Contact_Fax表中。现在Con_Fax_Temp我在 SQL 中提到的表如下所示:

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

我的目标是将我的 CSV 的每条记录插入到我的Contact_Fax表中,使用表的Contact_IDContact作为外键。为了检查我是否有正确的外键值,我想将表中的First_NameCompany_Name列的值与表中的和列进行比较。Con_Fax_TempFirst_NameCompany_IDContact

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

我希望我能解释得更好>_<

标签: sqlsql-server

解决方案


就像我在评论中所说的那样,您似乎在这里有一些非常粗略的架构。你拥有的连接逻辑非常脆弱。如果您在公司中有超过 1 个 Todd,会发生什么?加入这样的名字很可能在某个时候中断。

但是,如果我了解您要做什么(除了逻辑问题),您的查询将看起来像这样。请注意,我指定了插入的列。你应该总是这样做。此外,我为每一列都包含了表别名,这样您就可以准确地知道每个数据点来自哪个表。

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

推荐阅读