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

时间:2017-07-12 18:55:13

标签: sql sql-server stored-procedures

我有下表

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插入另一行。 (请注意 Inner j 已经出现在我的表格中,我再次插入 Inner 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的TopicId。 (解决)
  • 2。作为' Something'是内心J'的孩子。所以' Something'将是2因为'内在J'已存在于我的表格中。
  • 最终输出我想要的东西

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

    我怎样才能做到这一点?

    1 个答案:

    答案 0 :(得分:0)

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

    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 )
    

    以上代码检查TopicName中是否已存在具有给定TopicCodedbo.topic_details的记录,但未插入该记录。

    更新

    经过多次混淆之后,事实证明OP查询已经有效了。

    我注意到的另一个问题是topicid BIGINTparent_topicid INTEGER具有不同的数据类型。他们应该使用相同的列,这些列建立关系,并经常加入。