【问题标题】:Add data to child table using parent data使用父数据向子表添加数据
【发布时间】:2019-07-17 16:17:55
【问题描述】:

我有一个父表:OBSTACLES 和一个子表 AREA 2

CREATE TABLE [dbo].[OBSTACLES] (
    [ob_fid]  INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
    [RECORD_IDENTIFIER]  INT,
    [aero_surv_fid] INT
);

CREATE TABLE [dbo].[AREA 2] (
    [a2_fid]  INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
        [ob_fid]  INT FOREIGN KEY REFERENCES [dbo].[OBSTACLES]([ob_fid]) ON UPDATE AND DELETE CASCADE
);

我有一个双值数据源,它与 [dbo].[OBSTACLES] 中的 [RECORD_IDENTIFIER] 和 [aero_surv_fid] 值之一匹配。

我希望使用来自其父级的相应 [ob_fid] 填充 [dbo].[AREA 2]。

为了澄清,我从两个非唯一值开始,然后找到对应的唯一值,并将其插入到子表中。

我一直在用这个SQL在子表中插入一行数据:

DECLARE @ob_fid INT 
SET @ob_fid = (SELECT [ob_fid] FROM [dbo].[OBSTACLES] where [RECORD_IDENTIFIER] = 1021 AND [aero_surv_fid] = 2) 
IF @ob_fid IS NOT NULL INSERT INTO [dbo].[AREA 2] ([ob_fid]) VALUES (@ob_fid)

虽然这确实会产生结果,但需要很长时间。尤其是在做 1000 次时。使用父/子关系而不是逻辑是否有更好的查询?

谢谢。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    这是你想要的吗?

    DECLARE @AreasToInsert TABLE (RECORD_IDENTIFIER int, aero_surv_fid int)
    INSERT INTO @AreasToInsert (RECORD_IDENTIFIER, aero_surv_fid)
    VALUES (1021, 2), (etc, etc) -- Create this in Excel
    
    INSERT INTO [AREA 2] (ob_fid) 
    SELECT ob_fid 
    FROM OBSTACLES obs
    INNER JOIN @AreasToInsert a ON obs.RECORD_IDENTIFIER = a.RECORD_IDENTIFIER 
        AND obs.aero_surv_fid = a.aero_surv_fid
    

    【讨论】:

    • 谢谢,这正是我想要的。但是,在运行 4000 项查询时,最初的 5 分钟查询并没有花费太多时间。如果无法获得更优化的查询,我可能不得不提高我的 DTU?
    • 当您插入 4000 个项目时,您是运行上述 4000 次还是选择所有 4000 作为上述 SELECT 的一部分并将它们全部插入?后者会更快。您如何获得 WHERE 子句的值?
    • 我重复上面的4000次。我从大约 1000 到 5000 的数字列表开始,对于所有 4000 个查询,固定的 [aero_surv_fid] 值为 2
    • 我应该提到我有一个 4000 行的 excel 电子表格,它生成上述查询 4000 次。然后我将其粘贴到 SSMS 中。我可以使用一个更好的查询吗?
    • 我在阅读您的最后一条评论后编辑了我的答案,但只是注意到之前的评论。我不太清楚你现在想做什么。您是否尝试为每个现有的 [OBSTACLES] 行插入一个 ob_fid 到 [Area 2] 中,并且具有给定的 aero_surv_fid 和两个值之间的 RECORD_IDENTIFIER?如果是这样,请参阅我的第二个答案。
    猜你喜欢
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多