Sql 使用复杂查询结果更新表

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

我有以下疑问

没有乔布斯 选择 客户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更新表。例如选择的第一行结果可能类似于

所以我想对结果做一些类似的事情

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。这解决了我的问题,给了我想要的谢谢