RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1003489
Accepted
Olejan
Olejan
Asked:2020-07-16 22:35:50 +0000 UTC2020-07-16 22:35:50 +0000 UTC 2020-07-16 22:35:50 +0000 UTC

复制链接数据

  • 772

共有三个表:Objs, Attrs и Binds- 一个有对象,另一个 - 所有可能的参数,第三个 - 对象和属于它们的参数的对应关系,即 链接到该数据。如何将表Objs和的部分数据复制一份Binds,并粘贴到同一个表中,从而保留数据之间的对应关系?同时,表中的字段是Id唯一的并且是自动生成的。数据结构:ObjsAttrs

CREATE TABLE Objs(
  Id INT IDENTITY
 ,Name NVARCHAR(256) NULL
 ,CONSTRAINT PK_Objs_Id PRIMARY KEY CLUSTERED (Id)
) ON [PRIMARY];

CREATE TABLE Attrs(
  Id INT IDENTITY
 ,Name NVARCHAR(256) NULL
 ,CONSTRAINT PK_Attrs_Id PRIMARY KEY CLUSTERED (Id)
) ON [PRIMARY];

CREATE TABLE Binds(Obj_Id INT, Attr_Id INT);
ALTER TABLE Binds
ADD CONSTRAINT FK_Binds_Objs_Id FOREIGN KEY (Obj_Id) REFERENCES Objs (Id);
ALTER TABLE Binds
ADD CONSTRAINT FK_Binds_Attrs_Id FOREIGN KEY (Attr_Id) REFERENCES Attrs (Id);
GO

例子:

+------------------------+    +-------------------+    +--------------------+
| Objs                   |    | Attrs             |    | Binds              |
+--------+---------------+    +--------+----------+    +--------+-----------+
| Id     | Name          |    | Id     | Name     |    | Obj_Id | Attr_Id   | 
+--------+---------------+    +--------+----------+    +--------+-----------+
| 1      | Круг          |    | 1      | Длина    |    | 1      | 5         | 
| 2      | Прямоугольник |    | 2      | Ширина   |    | 2      | 1         | 
| 3      | Конус         |    | 3      | Высота   |    | 2      | 2         | 
+--------+---------------+    | 4      | Глубина  |    | 3      | 5         | 
                              | 5      | Радиус   |    | 3      | 3         | 
                              | 6      | Скорость |    +--------+-----------+
                              | 7      | Масса    |
                              | 8      | Время    |
                              +--------+----------+

您需要从 Objs 表中复制 Rectangle 和 Cone 并将其粘贴到其中,然后将对应关系粘贴到 Attrs 表中以结束

+------------------------+        +---------------------+
| Objs                   |        | Binds               |
+--------+---------------+        +---------+-----------+
| Id     | Name          |        | Obj_Id  | Attr_Id   | 
+--------+---------------+        +---------+-----------+
| 1      | Круг          |        | 1       | 5         | 
| 2      | Прямоугольник |        | 2       | 1         | 
| 3      | Конус         |        | 2       | 2         | 
| 4      | Прямоугольник |        | 3       | 5         |
| 5      | Конус         |        | 3       | 3         |
+--------+---------------+        | 4       | 1         |
                                  | 4       | 2         |
                                  | 5       | 5         |
                                  | 5       | 3         |
                                  +---------+-----------+ 

要将数据Objs и Binds复制到 Binds 表并将匹配项保存在 Binds 表中,我可以循环复制数据 - 从 Objs 表中复制必要的数据,将它们插入其中,获取新的 Id,然后从 Attrs 表中获取数据使用所需的 Obj_Id,将此数据插入表中,用新的 Obj_Id 替换旧的 Obj_Id。问题是可能有很多复制的数据,你不能使用循环,因为 sql查询中的循环大大减慢了它的执行速度,查询处理的速度对我来说很重要。

基于这一切,有几个问题:

  1. 我认为这是复制相关数据的典型任务。告诉我你在哪里可以看到这种复制的算法,或者,如果你知道,告诉它?
  2. 我可以确定 INSERT INTO 命令会按照我将数据传递给它的顺序将数据准确地插入到表中吗?
sql
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    i-one
    2020-07-16T23:00:36Z2020-07-16T23:00:36Z

    复制算法

    通常会创建一个查找表:

    CREATE TABLE #Mapping (Existing_Id int NOT NULL PRIMARY KEY, New_Id int NOT NULL);
    

    然后将必要的数据复制到主表中,并在对应表中显示成对的标识符(现有/新、原始/副本):

    MERGE INTO Objs T
    USING (
        SELECT Id, Name
        FROM Objs
        WHERE Name in (N'Прямоугольник', N'Конус')
    ) S
    ON 1 = 0
    WHEN NOT MATCHED THEN
        INSERT (Name)
        VALUES (S.Name)
    OUTPUT S.Id, INSERTED.Id INTO #Mapping (Existing_Id, New_Id);
    

    然后复制剩余表中的数据:

    INSERT INTO Binds (Obj_Id, Attr_Id)
    SELECT
        m.New_Id, b.Attr_Id
    FROM Binds b
        JOIN #Mapping m ON m.Existing_Id = b.Obj_Id;
    

    我可以确定 INSERT INTO 命令会按照我将数据传递给它的顺序将数据准确地插入到表中吗

    如果一次只插入一行。通常,插入顺序被认为是未定义的。以任何特定顺序插入行几乎没有意义,因为 插入顺序不保证任何存储或后续检索顺序。如果采用称职的方法,则不应出现这种需要。

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5