Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何更新外键_Sql Server_Ms Access - Fatal编程技术网

Sql server 如何更新外键

Sql server 如何更新外键,sql-server,ms-access,Sql Server,Ms Access,我有两张桌子;第一个表的设计如下: id_Doc_line_sheet DocNo lineNo Sheet No ------------------------------------------------------------------ 1001 doc-0001 line-0001 1 1002 doc-0

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

  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
    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_trans     id_Doc_line_sheet     name
---------------------------------------------------
 1                     1001                name01
 2                     1001                name02
 3                     1003                name03
 4                     1003                name04
 5                     1007                name07
 6                     1007                name08
表1

    id_Doc_line_sheet (pk),Autonumber
    DocNo (text)
    lineNo (text)
    Sheet No (text)
  id_Doc_line_trans (pk), Autonumber
  id_Doc_line_sheet (fk),Number
  name
字段组合(单据号、行号、工作表号)是索引和唯一的

第二个表的设计如下:

  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
    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_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

    id_Doc_line_sheet (pk),Autonumber
    DocNo (text)
    lineNo (text)
    Sheet No (text)
  id_Doc_line_trans (pk), Autonumber
  id_Doc_line_sheet (fk),Number
  name
现在在表1中,对于字段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
    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_trans     id_Doc_line_sheet     name
---------------------------------------------------
 1                     1001                name01
 2                     1001                name02
 3                     1003                name03
 4                     1003                name04
 5                     1007                name07
 6                     1007                name08
我想删除这些带有前导空格的记录,但首先我想更新每个唯一记录(DocNo、lineNo、Sheetno)的(id\u Doc\u line\u sheet)以更正一个记录(不带前导空格)。 我的意思是,如果表2如下所示:

  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
    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_trans     id_Doc_line_sheet     name
---------------------------------------------------
 1                     1001                name01
 2                     1001                name02
 3                     1003                name03
 4                     1003                name04
 5                     1007                name07
 6                     1007                name08
我将(id\u文档\u行\u表)更新为如下内容:

  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
    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_trans     id_Doc_line_sheet     name
---------------------------------------------------
 1                     1001                name01
 2                     1001                name02
 3                     1003                name03
 4                     1003                name04
 5                     1007                name07
 6                     1007                name08
然后从第一个表中删除带前导空格的记录


请帮助我怎么做?

根据我的理解,您似乎想根据使用的
表号
第一个
id
更新
表2
。如果是,您可以使用以下选项:

解释

  • 您需要使用
    报告
    cte根据
    表号
    获取
    表1
    中的第一条记录
  • 表2中为每一行查找相应的
    表号
  • 更新
    表2
    条目,其中
    行数=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
    
    更新后的结果
    表2

        id_doc_line_trans   id_doc_line_sheet   name
        1   1001    name01
        2   1001    name02
        3   1003    name03
        4   1003    name04
    
    然后,您可以根据自己的需求应用delete语句

    这是一张工作票


    希望这能对你有所帮助

    这是一种不使用分析函数的方法,在我看来这是最简单的方法。我们可以在
    table1
    上进行聚合,并将记录的id(带和不带前导空格)都透视出来。此外,我们还可以检查以确保给定的文档/工作表甚至出现了这样的页面。然后,我们需要做的就是将
    table2
    连接到第一个CTE,以在单个记录中获得新旧id值

    WITH cte1 AS (
        SELECT
            DocNo, [Sheet No],
            MAX(CASE WHEN [lineNo] LIKE ' %' THEN id_Doc_line_sheet END) AS id_old,
            MAX(CASE WHEN [lineNo] NOT LIKE ' %' THEN id_Doc_line_sheet END) AS id_new
        FROM table1
        GROUP BY DocNo, [Sheet No]
        HAVING SUM(CASE WHEN [lineNo] LIKE ' %' THEN 1 ELSE 0 END) > 0
    ),
    cte2 AS (
        SELECT
            t1.id_Doc_line_trans, t1.id_Doc_line_sheet, t1.name, t2.id_old, t2.id_new
        FROM table2 t1
        INNER JOIN cte1 t2
            ON t1.id_Doc_line_sheet = t2.id_old
    )
    
    UPDATE cte2
    SET id_Doc_line_sheet = id_new;
    
    注意,更新逻辑很简单;所有感兴趣的信息和记录都已包含在第二次CTE中


    您使用的是SQL Server还是Access?它们是非常不同的数据库。我的表在sql server中作为后端,查询在Ms access中作为前端,如果我能知道这两种解决方案将非常有用,但如果我能知道其中一个数据库的解决方案,任何方法对我来说都是可行的,因为我需要更新查询来更新我的表一次。谢谢你的澄清。谢谢,我如何在这句话中确定(update t set t.id_doc_line_sheet=r.id_doc_line_sheet),r.id_doc_line_sheet与没有前导空格的行号相关,在示例(表1)中,id_doc_line_sheet与没有前导空格的行号相关,并且有效,但是在我的数据库中,我不确定第一条记录是否总是与行号相关,没有前导空格。您可以在标准中添加以下
    和行号不象“%”
    谢谢是否可以修改您关于新Commnet的答案我收到的答案假设每个文档号、工作表号,我有类似的行号(带前导空格或不带前导空格)但在我的数据库中,我对每个文档编号、工作表编号有不同的行号(如我在问题中编辑的),请帮助解决问题。谢谢Tim,两个答案都解决了我的问题,但我可以选择一个作为我的答案,为了像你一样提高mona的声誉分数,我接受mona作为我的答案。我得到的答案取决于我收到的答案,假设每个文件编号、工作表编号,我有类似的行号(带前导空格或不带前导空格)但在我的数据库中,每个文件编号、工作表编号(我在问题中编辑)都有不同的行号,请帮助解决问题。@MasoudSedighi一般来说,你不应该这样更改你的问题,因为它会吸引选票。我将在这里留下我的答案,作为对你原始问题的有效回答。