Sql server SQL server:将缺少的数据从一个表插入/更新到另一个表

Sql server SQL server:将缺少的数据从一个表插入/更新到另一个表,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我有两个表容器和控件。这些是现有的表,两者之间没有外键关系。这些表也是非常旧的表,因此没有标准化。我现在不能改变结构 以下是两个表的结构 容器表: 控制表: 控制表中的名称字段包含容器表中的CTableName+CPName 我想用Container table的CID column值更新控制表的columnName字段。并且还要为ctable2插入一条更多的记录,即控制表下面最终控制表中的第四行 tablename和columnname列始终具有默认值 最终控制表应如下所示: 如何做到这一点

我有两个表容器和控件。这些是现有的表,两者之间没有外键关系。这些表也是非常旧的表,因此没有标准化。我现在不能改变结构

以下是两个表的结构

容器表:

控制表:


控制表中的名称字段包含容器表中的CTableName+CPName

我想用Container table的CID column值更新控制表的columnName字段。并且还要为ctable2插入一条更多的记录,即控制表下面最终控制表中的第四行

tablename和columnname列始终具有默认值

最终控制表应如下所示:


如何做到这一点?

我是一名Oracle plsql程序员,也曾与Sql server合作

首先,你应该描述这两个表之间的关系,最后我可以把它说出来,但最好你自己解释一下。 要使用另一个表中的信息更新表,您应该问自己: -更新应该在什么时候进行? -启动更新的条件是什么? -更新应该如何进行

在Oracle中,有一个称为触发器的数据库对象。这是一件非常方便的物品,可能正是你所需要的。我相信sql server也有

请免费询问任何问题,但一定要阅读sql server相关手册


祝你好运,Edward。

我希望你想应用此修复程序,因为你想规范化你的表结构

试试这个:

第一步:

通过这种方式,您将使用Container table的值更新所有控制行,其中CTableName和CPName两个字段的名称相同,不包括具有相同两个字段的Container行

UPDATE Control
SET ColumnValue = (
    SELECT c.CID
    FROM Container c
    WHERE c.CTableName + '+' + c.CPName = Control.Name
    AND NOT EXISTS(
         SELECT 'PREVIOUS'
         FROM Container c2
         WHERE c.CTableName = c2.CTableName
         AND c.CPName = c2.CPName
         AND c.CID < c2.CID
    )
),
TableName = 'default', ColumnName = 'default'
WHERE ColumnValue IS NULL

完成这两个步骤后,您可以在控制表中删除列名

查看ctable2的新插入行在哪里?控制表中的名称字段包含容器表中的CTableName+CPName,这是一个糟糕的主意,您确实应该在标题中有两列如果这是您正在创建的新表,我同意拉马克的观点——把这些作品分成自己的专栏。然而,如果这是一件已经存在的事情,你必须付出巨大的努力才能改变查看在表上创建计算列以解析出这两个值。感谢您的响应。我会试试看。我不想使表格正常化。我只想插入data@sid:最后一句话是你的;但有两个问题可以吗?
INSERT INTO Control (field list)
SELECT field list
FROM Container co
WHERE NOT EXISTS(
    SELECT 'in_control'
    FROM Control ct
    WHERE co.CID = ct.ColumnValue
)