Sql 使用复杂查询结果更新表
我有以下疑问 没有乔布斯 选择 客户ID, 工作类型, 书 页 NextDocBook=LEADJob.Book OVER PARTITION BY CustomerID,JobType ORDER BY Book,Page, NextDocPage=LEADJob.Page OVER PARTITION BY CustomerID,JobType ORDER BY Book,Page 从工作列表作业 其中EndBook=或EndPage= 选择 NoEndJobs.CustomerID, NoEndJobs.JobType, NoEndJobs.书, 诺恩德乔布斯,佩奇, 合并LastJobInfo.Book,作为EndBook, CoalesclastJobInfo.Page,作为EndPage 来自NoEndJobs 左连接 选择 客户ID, 工作类型, 书 页 预防 来自工作条目 下一个工作条目 NextJobEntry.CustomerID=NoEndJobs.CustomerID和 NextJobEntry.JobType=NoEndJobs.JobType和 NextJobEntry.Book=NoEndJobs.NextDocBook和 NextJobEntry.Page=NoEndJobs.NextDocPage 左连接 选择 身份证件 书 页 来自工作条目 LastJobInfo.ID=NextJobEntry.PrevEntry上的LastJobInfo 订购人 NoEndJobs.CustomerID, NoEndJobs.JobType, NoEndJobs.书, NoEndJobs.Page; 我希望能够使用生成的SELECT行更新名为JobList的表 我想根据CustomerID、JobType、Book和Page更新表。例如选择的第一行结果可能类似于 所以我想对结果做一些类似的事情Sql 使用复杂查询结果更新表,sql,sql-server,sql-server-2016,Sql,Sql Server,Sql Server 2016,我有以下疑问 没有乔布斯 选择 客户ID, 工作类型, 书 页 NextDocBook=LEADJob.Book OVER PARTITION BY CustomerID,JobType ORDER BY Book,Page, NextDocPage=LEADJob.Page OVER PARTITION BY CustomerID,JobType ORDER BY Book,Page 从工作列表作业 其中EndBook=或EndPage= 选择 NoEndJobs.CustomerID, No
UPDATE JobList
SET JobList.EndBook=RESULTS.EndBook, JobList.EndPage=RESULTS.EndPage
WHERE
JobList.CustomerID=RESULTS.CustomerID AND
JobList.JobType=RESULTS.JobType AND
JobList.Book=RESULTS.Book AND
JobList.Page=RESULTS.Page
如果我不清楚我想做什么,如果有人要求,我可以详细说明。基本上,如果EndBook和EndPage字段不为空,我希望获取结果并更新与数据集匹配的表
我尝试过做一些不同的事情,但总是会出现语法错误,无法使其正常工作。上面的查询是可靠的,但效果很好 您可以通过以下两个步骤完成: 步骤1:将结果存储到[结果]
WITH NoEndJobs AS ( /* this part does not change */
... /* TL, NR */
)
WITH [Result] as( /* the rest part goes to here */
... /* TL, NR */
)
步骤2:将[结果]合并到[作业列表]:
Merge
[JobList] as TARGET
Using
[Result] as SOURCE
On
(TARGET.CustomerID=RSOURCE.CustomerID AND
TARGET.JobType=SOURCE.JobType AND
TARGET.Book=SOURCE.Book AND
TARGET.Page=SOURCE.Page)
When MATCHED
Then Update Set
TARGET.EndBook = SOURCE.EndBook,
TARGET.EndPage=SOURCE.EndPage
您可以通过以下两个步骤执行此操作: 步骤1:将结果存储到[结果]
WITH NoEndJobs AS ( /* this part does not change */
... /* TL, NR */
)
WITH [Result] as( /* the rest part goes to here */
... /* TL, NR */
)
步骤2:将[结果]合并到[作业列表]:
Merge
[JobList] as TARGET
Using
[Result] as SOURCE
On
(TARGET.CustomerID=RSOURCE.CustomerID AND
TARGET.JobType=SOURCE.JobType AND
TARGET.Book=SOURCE.Book AND
TARGET.Page=SOURCE.Page)
When MATCHED
Then Update Set
TARGET.EndBook = SOURCE.EndBook,
TARGET.EndPage=SOURCE.EndPage
你可以;您只需包括正在更新的列:
WITH NoEndJobs AS (
SELECT
CustomerID,
JobType,
Book,
Page,
EndBook,
EndPage,
NextDocBook = LEAD(Job.Book) OVER (PARTITION BY CustomerID, JobType ORDER BY Book, Page),
NextDocPage = LEAD(Job.Page) OVER (PARTITION BY CustomerID, JobType ORDER BY Book, Page)
FROM JobList Job
WHERE EndBook='' OR EndPage=''
)
UPDATE NoEndJobs
SET
EndBook = coalesce(LastJobInfo.Book, ''),
EndPage = coalesce(LastJobInfo.Page, '')
FROM NoEndJobs
LEFT JOIN
(
SELECT
CustomerID,
JobType,
Book,
Page,
PrevEntry
FROM JobEntries
) NextJobEntry ON
NextJobEntry.CustomerID=NoEndJobs.CustomerID AND
NextJobEntry.JobType=NoEndJobs.JobType AND
NextJobEntry.Book=NoEndJobs.NextDocBook AND
NextJobEntry.Page=NoEndJobs.NextDocPage
LEFT JOIN
(
SELECT
ID,
Book,
Page
FROM JobEntries
) LastJobInfo ON LastJobInfo.ID=NextJobEntry.PrevEntry;
SELECT *
FROM JobList
ORDER BY
CustomerID,
JobType,
Book,
Page;
你可以;您只需包括正在更新的列:
WITH NoEndJobs AS (
SELECT
CustomerID,
JobType,
Book,
Page,
EndBook,
EndPage,
NextDocBook = LEAD(Job.Book) OVER (PARTITION BY CustomerID, JobType ORDER BY Book, Page),
NextDocPage = LEAD(Job.Page) OVER (PARTITION BY CustomerID, JobType ORDER BY Book, Page)
FROM JobList Job
WHERE EndBook='' OR EndPage=''
)
UPDATE NoEndJobs
SET
EndBook = coalesce(LastJobInfo.Book, ''),
EndPage = coalesce(LastJobInfo.Page, '')
FROM NoEndJobs
LEFT JOIN
(
SELECT
CustomerID,
JobType,
Book,
Page,
PrevEntry
FROM JobEntries
) NextJobEntry ON
NextJobEntry.CustomerID=NoEndJobs.CustomerID AND
NextJobEntry.JobType=NoEndJobs.JobType AND
NextJobEntry.Book=NoEndJobs.NextDocBook AND
NextJobEntry.Page=NoEndJobs.NextDocPage
LEFT JOIN
(
SELECT
ID,
Book,
Page
FROM JobEntries
) LastJobInfo ON LastJobInfo.ID=NextJobEntry.PrevEntry;
SELECT *
FROM JobList
ORDER BY
CustomerID,
JobType,
Book,
Page;
你还可以分享预期结果吗:还可以查看此链接了解如何改进问题:你还可以分享预期结果吗:还可以查看此链接了解如何改进问题:Dang!我是如此接近!!!我知道有一种方法可以使用连接进行更新。我尝试的每件事都有语法错误。。。这看起来正是我想要的。谢谢8kb!我将试一试,稍后接受。我最后做了一个小的更正,但没有显示正确的结果,因为在CTE NoEndJobs中添加了EndBook和EndPage。这解决了我的问题,给了我想要的谢谢该死!我是如此接近!!!我知道有一种方法可以使用连接进行更新。我尝试的每件事都有语法错误。。。这看起来正是我想要的。谢谢8kb!我将试一试,稍后接受。我最后做了一个小的更正,但没有显示正确的结果,因为在CTE NoEndJobs中添加了EndBook和EndPage。这解决了我的问题,给了我想要的谢谢