SQL 服务器:Inserting/updating 缺少从一个 table 到另一个的数据

SQL server : Inserting/updating missing data from one table to another

我有两个 table "Container" 和 "Control"。这些是现有的 table 并且两者之间没有外键关系。这些也是非常旧的 table,所以没有标准化。我现在不能改变结构。

下面是两个table的结构。

容器table:

对照Table:

控件 table 中的名称字段包含来自容器 table 的 CTable名称+CPName。

我想用 Container table 的 CID 列的值更新 Control table 的 columnName 字段。并且还想在 Control table.

中再插入一条记录(对于 ctable2,即下面最终 Control table 中的第四行)

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

最终控件 table 应如下所示:

我该怎么做?

我是 Oracle plsql 程序员,也曾使用 Sql-server。

首先你应该描述一下2个table之间的关系,最后我能搞清楚,但你最好自己解释一下。 要使用来自另一个 table 的信息更新 table,您应该问问自己: - 应该什么时候更新? - 开始更新的条件是什么? - 应该如何更新?

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

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

祝你好运,爱德华。

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

试试这个:

第一步:

通过这种方式,您将使用 Container table 的值更新所有 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

第二步:

控件中没有添加元素table

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
)

完成这两个步骤后,您可以在控件中删除列名称 table