代码之家  ›  专栏  ›  技术社区  ›  Skitzafreak

不确定如何正确执行此SQL

  •  0
  • Skitzafreak  · 技术社区  · 7 年前

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

    基本上我有以下两个表:

    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
    

    伊迪丝2:所以我描述我要完成的任务时很可怕。

    我正在尝试插入来自 Contact_Fax csv输入 联系人传真 表。现在 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_ID 的列 Contact 表作为外键。要检查是否具有正确的外键值,我要比较 First_Name Company_Name 中的列 传真温度 带有的表 名字 Company_ID 中的列 联系人 表。

    注: 这个 联系人 表具有外键 公司ID 所以我加入了 Company 表以便我可以引用 公司名称 与每个 公司ID

    我希望我能更好地解释这一点。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Sean Lange    7 年前

    就像我在评论中说的,你们这里的建筑看起来相当粗略。你的连接逻辑非常脆弱。如果你在一家公司有超过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