如何更新外键

时间:2017-11-25 08:14:03

标签: sql-server ms-access

我有2张桌子;第一张表的设计如下:

表1

    id_Doc_line_sheet (pk),Autonumber
    DocNo (text)
    lineNo (text)
    Sheet No (text)

字段组合(DocNo,lineNo,Sheet No)是索引和唯一。

第二张表的设计如下:

表2

  id_Doc_line_trans (pk), Autonumber
  id_Doc_line_sheet (fk),Number
  name

现在在table1中,对于field lineNo,我有带前导空格的记录,没有前导空格,如下所示:

  id_Doc_line_sheet            DocNo        lineNo      Sheet No    
  ------------------------------------------------------------------
  1001                         doc-0001    line-0001    1
  1002                         doc-0001     line-0001   1
  1003                         doc-0001    line-0001    2
  1004                         doc-0001     line-0001   2
  1005                         doc-0002    line-0002    1
  1006                         doc-0002     line-0002   1
  1007                         doc-0001    line-0005    1
  1008                         doc-0001     line-0005   1

我希望用前导空格删除这些记录,但首先我想为每个唯一(DocNo,lineNo,Sheetno)更新(id_Doc_line_sheet)以更正一个(没有前导空格)。  我的意思是如果table2如下所示:

    id_Doc_line_trans     id_Doc_line_sheet     name
    ---------------------------------------------------
     1                        1001              name01
     2                        1002              name02
     3                        1003              name03
     4                        1004              name04
     5                        1007              name07
     6                        1008              name08

我将(id_Doc_line_sheet)更新为以下内容:

id_Doc_line_trans     id_Doc_line_sheet     name
---------------------------------------------------
 1                     1001                name01
 2                     1001                name02
 3                     1003                name03
 4                     1003                name04
 5                     1007                name07
 6                     1007                name08

然后从第一个表中删除带有前导空格的记录。

请帮助我怎么做?

2 个答案:

答案 0 :(得分:2)

根据我的理解,您似乎希望根据所使用的table2首先sheet_no更新id。如果是这样,您可以使用以下内容:

<强>解释

  1. 您需要使用table1 cte
  2. 基于sheet_no获取report中的第一条记录
  3. sheet_no
  4. 中的每一行找到相应的table2
  5. 更新table2
  6. 所在的row_number =1条目

    <强>查询

    ;with report as(
       select row_number() over(partition by sheet_no order by id_doc_line_sheet) as [Row],id_doc_line_sheet,sheet_no
       from table1       
       where line_no not like ' %' -- here you can ensure that lin_no doesn't start with leading space
    ), combined as(
        select t2.id_doc_line_trans,
               t2.id_doc_line_sheet,
               t1.sheet_no
        from table2 t2
        inner join table1 t1 on t2.id_doc_line_sheet = t1.id_doc_line_sheet
    )
    
    update t set t.id_doc_line_sheet = r.id_doc_line_sheet
    from report r 
    inner join combined c on r.sheet_no = c.sheet_no
    inner join table2 t on t.id_doc_line_trans = c.id_doc_line_trans
    where r.[Row]=1
    
    更新table2

    后的

    结果

        id_doc_line_trans   id_doc_line_sheet   name
        1   1001    name01
        2   1001    name02
        3   1003    name03
        4   1003    name04
    

    然后您可以根据您的要求应用删除声明

    这是一个有效的demo

    希望这会对你有所帮助

答案 1 :(得分:2)

这是一种不使用分析函数的方法,这是在我脑海中解决这个问题的最简单方法。我们可以聚合超过survey_df并使用和不使用前导空格来转出记录的id。此外,我们可以检查以确保给定的文档/表格甚至出现这样的页面。然后,我们需要做的就是将table1加入到第一个CTE中,以便在一个记录中获取旧的和新的id值。

table2

请注意,更新逻辑很简单;所有感兴趣的信息和记录已经包含在第二个CTE中。

Demo