2017-08-11 67 views
1

我有以下查詢......使用一個複雜的查詢結果更新表

WITH NoEndJobs AS (
    SELECT 
     CustomerID, 
     JobType, 
     Book, 
     Page, 
     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='' 
) 
SELECT 
    NoEndJobs.CustomerID, 
    NoEndJobs.JobType, 
    NoEndJobs.Book, 
    NoEndJobs.Page, 
    coalesce(LastJobInfo.Book, '') AS EndBook, 
    coalesce(LastJobInfo.Page, '') AS EndPage 
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 
ORDER BY 
    NoEndJobs.CustomerID, 
    NoEndJobs.JobType, 
    NoEndJobs.Book, 
    NoEndJobs.Page; 

我希望能夠以更新指定的JobList與得到的SELECT行表。

我想根據CustomerID,JobType,Book和Page來更新表格。比如...從選擇第一行的結果可能是這樣的......

enter image description here

所以我想這樣做的結果..

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 

如果我我不清楚自己想要做什麼,如果需要,我可以詳細說明。基本上,我想獲得我的結果並更新匹配數據集的表IF EndBook和EndPage字段不是空白('')。

我試圖做一些不同的事情,但總是得到語法錯誤永遠無法使其工作。上面的查詢是可靠的,並且運行良好!

+0

可你也分享預期的結果:也看看這個鏈接瞭解更多關於如何提高的問題:HTTPS://spaghettidba.com/ 2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ – TheGameiswar

回答

0

可以做到這一點在以下兩個步驟:

步驟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 
0

您可以update the CTE itself;你只需要包含的列要更新:

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; 

SQL Fiddle

+0

當!我太親近了!我知道有一種方法可以使用JOINS進行更新。我所嘗試的所有東西都有語法錯誤...這看起來完全是我以前的樣子。謝謝8kb!我會給它一點,接受一點。 –

+0

我終於做了一個小的改正,因爲EndBook和EndPage被添加到CTE(NoEndJobs)後,沒有顯示正確的結果。這解決了我的問題,並給了我想要的東西! - 謝謝! –