sql - 不确定如何正确执行此 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_Fax
CSV 中的数据插入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_ID
列Contact
作为外键。为了检查我是否有正确的外键值,我想将表中的First_Name
和Company_Name
列的值与表中的和列进行比较。Con_Fax_Temp
First_Name
Company_ID
Contact
注意:该Contact
表具有外键Company_ID
,这就是为什么我在Company
表上使用 Join 以便我可以引用Company_Name
与每个关联的Company_ID
我希望我能解释得更好>_<
解决方案
就像我在评论中所说的那样,您似乎在这里有一些非常粗略的架构。你拥有的连接逻辑非常脆弱。如果您在公司中有超过 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
推荐阅读
- r - 根据其他变量删除行的子集
- wpf - 如何将 ObservableCollection 绑定到 WPF 中的组合框?
- javascript - 将原始查询转换为续集
- java - 为什么不同日期的时间戳相同而没有部分时间?
- swagger - 如何在asp.net core 2.2 web api中使用不同版本的相同参数创建相同的路由名称
- reactjs - 您可以在 Material UI 中添加额外的颜色吗?
- swagger - 如何使用 NSwag 生成 OpenAPI 2.0 文件?
- python - 上传受信任的笔记本(ipynb)后 Github 不显示地图?
- python - 我正在处理simpleimputer并在python中出现错误“输入包含NaN,无穷大或对于dtype('float64')来说太大的值”这是我的代码
- swift - SwiftUI / Combine:监听数组项值变化