如果列值 id 与另一个表中的 ID 描述匹配,则在指定列中插入数据(规范化形式)

Posted

技术标签:

【中文标题】如果列值 id 与另一个表中的 ID 描述匹配,则在指定列中插入数据(规范化形式)【英文标题】:Insert Data in specified column if column value id matches the description of the ID in another table (normalized form) 【发布时间】:2017-04-10 08:00:42 【问题描述】:

为了做到这一点(在标题描述中),很明显它已经是一个规范化的数据库,因此肯定会使用内部连接类型的检查。

假设我们有一个客户表和一个给定的 customer_ID 作为主键,以及描述名字姓氏等以及另一个表 (Customer_Sales_History) 的 Customer_ID 列,也是为了使其可搜索查询。

更新: 我的困难是我需要在特定列中添加以 XML(Soap 响应)格式获取的特定数据,但通过 Customer_Name 和 Customer_Lastname 检查附加到特定的 Customer_ID。

如果 Customer_Name = "John" 和 Customer_Lastname = "Martin",则使用值填充 salescode productquantity 和 productdescription

卷很大(​​数千行),因此 sql 可能必须作为来自另一个表的插入来填充,我对那种类型的 slqing 卷很陌生。

           Customer Table
Customer_ID | Customer_Name | Customer_Lastname 
1           |  John         | Martin
2           |  Jack         | White
3           |  Don          | Carrera

     Customer_Sales_History Table

Customer_ID | Sales_Code | ProductQuantity | ProductDescription
2           |     X      |        X        |         X

为了将给定数据插入到 Customer_Sales_History 表中,将 Customer_ID 2 作为给定目标,我必须匹配 Customer_Name = Jack 和 Customer_Lastname = White 的行并填充 Sales_Code Product_Quantity 和 Product Description。

【问题讨论】:

那么“XML 格式”应该是什么样子?里面需要什么资料?您真的需要插入 数据还是要更新 历史记录表中的现有行? sales_code、productquantity 和 productdescription 的值从何而来?您的客户表似乎没有。 这是一个肥皂反应,所以它就像 JackWhite20002 SQL HOW TO FOR DUMMIES 事情还在于,像这个响应一样,还有 45.000 个其他人......所以我想要做的是创建一个 SQL 语句,所以我不必手动执行......除此之外我可以用 Navicat 做。 1 行不需要 SQL 代码。 对不起,我不明白。为什么不能使用简单的insert into customer_sales_history (...) values (...) 我可以预先创建表,因此在该 SQL 语句中创建不是问题。 如果我只是简单地添加它们,我将与已列出的客户创建副本,而我真正想要的是将销售附加到已存储的客户。如果它们已经存在。 【参考方案1】:
Update ch
set ch.sales_code = ...,
    ch. ProductQuantity =...,
from  Customer_Sales_History ch join Customer c on ch. Customer_ID= c.Customer_ID
where ch.Customer_ID=2

【讨论】:

不要不要在 UPDATE 语句的 from 子句中指定目标表,除非您希望将该表与其自身进行交叉连接。 你是什么意思?你能写下来吗? 手册上已经写了:postgresql.org/docs/current/static/sql-update.html(见from_list部分) “它必须以别名出现在 from_list 中”。所以没关系。不是吗? 不,不是 - "请注意,目标表必须出现在 from_list 中,除非您打算自加入" - 您的update 语句 will 创建一个完全没有必要的自连接,并且会导致更多行被更新 - 这是完全错误的(另外:adtoctor 想要 insert 数据,而不是更新)【参考方案2】:

如果您已将客户表中的customer_ID 声明为主键,将Customer_Sales_History 表中的customer_ID 声明为外键,那么它将自动执行检查部分。 那么,为什么需要显式检查 customer_id?

【讨论】:

因为我给定的数据不知道数据库格式,他们只是给你客户的描述,例如 Jack White 是我必须在行中匹配的描述才能插入新的数据。

以上是关于如果列值 id 与另一个表中的 ID 描述匹配,则在指定列中插入数据(规范化形式)的主要内容,如果未能解决你的问题,请参考以下文章

如何通过将一个表中的 id 与另一个表匹配来选择和更新一个表中的记录?

如果每个工作表中的字符串匹配,则修复删除行

如何覆盖 bigquery 现有表中的列值

如果发现一个逗号分隔记录与另一个逗号分隔记录匹配,则获取记录

如果任何列与另一个表中的匹配行不同,如何插入行

从一个表中选择所有元素,并检查它们是不是与另一个表匹配