将分层数据插入具有特定条件的表中



>我有下表

CREATE TABLE Topic_details(
topicid BIGINT  NOT NULL PRIMARY KEY IDENTITY(1,1)
,parent_topicid BIGINT  
,description NVARCHAR(184) NOT NULL
,code   NVARCHAR(43) NOT NULL
,lang_id INT 
,entryby INT  NOT NULL
,enrtydate DATE  NOT NULL
,last_updateby INT 
,last_update_date DATE 
);

现在在其中插入一些示例数据

INSERT INTO Topic_details(topicid,parent_topicid,description,code,lang_id,entryby,enrtydate,last_updateby,last_update_date)
VALUES
(1,NULL,N'Overview of C',N'Overview of C',NULL,10238,'2017-06-10 13:09:52.297',NULL,NULL)
,(2,1,N'Features of C',N'Features of C',NULL,10238,'2017-06-10 13:10:09.060',NULL,NULL)
,(3,1,N'C Language Applications',N'C Language Applications',NULL,10238,'2017-06-10 13:13:13.607',NULL,NULL)
,(4,1,N'C Program Execution',N'C Program Execution',NULL,10238,'2017-06-10 13:13:32.623',NULL,NULL)
,(5,1,N'What is Interpreter ?',N'What is Interpreter ?',NULL,10238,'2017-06-10 13:14:17.897',NULL,NULL)

现在在我的应用程序中,需要从 excel 插入此类数据。

现在,用户将上传的工作表由三列组成

ParentTopicName|TopicName|Code|
---------------|---------|----|

并让一些示例数据进入其中,

ParentTopicName|TopicName|Code|
---------------|---------|----|
|Joins    |Join|
----------------|---------|----|    
Joins     | Inner J | IJ |
-------------------------------|
Joins     | Left J  | LJ |

现在我有一个数据表,它将存储 excel 的数据。

现在,在程序中

Create ROCEDURE [dbo].[sp_upload_topic_subtopic]
@entry_by bigint = null,
@lang_id nvarchar(20) = null,
@dtTopicSubtopic ttTopicSubtopic  ReadOnly -- to store value from datatable
AS
BEGIN
INSERT INTO dbo.topic_details([description], code,entryby,enrtydate,lang_id)
SELECT d.TopicName, d.TopicCode,@entry_by,Getdate(),1 from @dtTopicSubtopic as d
UPDATE td
SET td.parent_topicid= ptd.topicid
FROM dbo.topic_details td
INNER JOIN @dtTopicSubtopic d ON d.TopicName=td.[description]
INNER JOIN topic_details ptd ON d.ParentTopic=ptd.[description]
END

这将按预期将数据存储在表中Topic_Details 存放到表中后,

---------------------------------------------------
Topic_Details
---------------------------------------------------
TopicId   |ParentTopiID|desciption|Code|.....
---------------|------------|----------|----|.....
1       | NULL       | Joins    |Join|.....
---------------|------------|----------|----|.....
2       |   1        | Inner J  | IJ |.....
---------------|------------|----------|----|.....
3       |    inserted data..................
--------------|------------------------------------ 
4       |    inserted data...................
--------------|-------------------------------------

现在稍后假设我正在从 excel 插入另一行。(请注意,内 j已经存在于我的表中,我再次插入内 J

ParentTopicName|TopicName |Code|
---------------|--------- |----|
|Inner J   |Ij  |
----------------|--------- |----|  
Inner J     |Some Thing| dj |

这会将数据插入到表中Topic_details

如下所示
TopicId   |ParentTopiID|desciption|Code|.....
---------------|------------|----------|----|.....
1       | NULL       | Joins    |Join|.....
---------------|------------|----------|----|.....
2       |   1        | Inner J  | IJ |.....
3...... 
4......
5      |    Null     |   Inner J  | IJ | .... 
-------------|-------------|------------|----|-----
6      |   2         |   Something|hfdj|......

但是由于"内J"已经出现在我的表中,所以,

  • 1. 不会插入 5 的主题 ID。(已解决(
  • 2. 由于"某物"是"内 J"的
  • 子级,因此"某物"的父 id 将是 2,因为"内 J"已经存在于我的表中。
  • 最终输出 放我想要的

    ------------------------------------------------------                   
    Topic_details
    -------------------------------------------------------
    TopicId        |ParentTopiID|desciption|Code|.....
    ---------------|------------|----------|----|.....
    1       | NULL       | Joins    |Join|.....
    ---------------|------------|----------|----|.....
    2       |   1        | Inner J  | IJ |.....
    ---------------|------------|----------|-----|       
    3.....................
    4.....................
    5.....................    
    -------------|-------------|------------|----|-----
    6       |   2         |   Something|hfdj|......
    

    我怎样才能做到这一点?

    如果我正确理解您的问题,您不想插入重复的记录。

    INSERT INTO dbo.topic_details([description], code,entryby,enrtydate,lang_id)
    SELECT d.TopicName, d.TopicCode,@entry_by,Getdate(),1 from @dtTopicSubtopic as d
    WHERE NOT EXISTS( SELECT * FROM dbo.topic_details AS Cur WHERE Cur.TopicName = d.TopicName AND Cur.TopicCode = d.TopicCode )
    

    上面的代码检查具有给定TopicNameTopicCode的记录是否已存在于dbo.topic_details中并且不会插入它。

    更新:

    经过很多混乱,事实证明,这是由于OP查询已经起作用的事实。

    我注意到的另一个问题是topicid BIGINTparent_topicid INTEGER是不同的数据类型。它们应使用与这些列建立关系相同的列,并且将频繁连接。

    最新更新