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一般来说,你不应该这样更改你的问题,因为它会吸引选票。我将在这里留下我的答案,作为对你原始问题的有效回答。