SQL服务器:将缺失数据从一个表插入/更新到另一个表

时间:2015-01-29 14:31:28

标签: sql-server sql-server-2008

我有两个表“Container”和“Control”。这些是现有的表,两者之间没有外键关系。这些也是非常古老的表,所以没有标准化。我现在无法改变结构。

以下是两个表格的结构。

容器表:

enter image description here

控制表: enter image description here

Control表中的Name字段包含Container表中的CTableName + CPName。

我想用Container表的CID列的值更新Control表的columnName字段。并且还希望在控制表中再插入一条记录(对于ctable2,即下面最终控制表中的第四行)。

tablename和columnname列将始终具有默认值。

最终的控制表应如下所示:

enter image description here

我该怎么做?

2 个答案:

答案 0 :(得分:0)

我希望你想应用这个修补程序,因为你想要规范化你的表结构。

试试这个:

第一步:

通过这种方式,您可以使用Container表的值更新所有Control行,其中,耦合字段CTableName和CPName与Name相同(不包括具有相同耦合字段的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

第二步:

添加控件表中不存在的元素

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
)

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

答案 1 :(得分:-1)

我是Oracle plsql程序员,并且也使用过Sql-server。

首先你应该描述两张桌子之间的关系,最后我可以搞清楚,但你最好自己解释一下。 要使用另一个表中的信息更新表,您应该问自己: - 何时应该进行更新? - 开始更新的条件是什么? - 如何进行更新?

在Oracle中,有一个名为触发器的数据库对象。它是一个非常方便的对象,可能就是你需要的东西。我相信sql-server也有它。

请免费提出任何问题,但也请阅读sql-server相应的手册。

好运,爱德华。