2017-08-11 1 views
1

je la requête suivante ...résultats de la requête complexes à mettre à jour une table

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; 

Je veux être en mesure de mettre à jour une table nommée JobList avec les lignes SELECT résultantes.

Je voudrais mettre à jour la table basée sur le CustomerID, JobType, Book et Page. Par exemple ... Les premiers résultats de ligne de la sélection pourrait être quelque chose comme ...

enter image description here

Je veux faire quelque chose comme ça avec les résultats ..

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 

Si je Je ne suis pas clair sur ce que j'essaie de faire, je peux entrer dans plus de détails si demandé. Fondamentalement, je veux prendre mes résultats et mettre à jour la table qui correspond à l'ensemble de données. Les champs IF EndBook et EndPage ne sont pas BLANK ('').

J'ai essayé de faire quelques choses différentes mais j'ai toujours des erreurs de syntaxe qui n'arrivent jamais à le faire fonctionner. La requête ci-dessus est solide et fonctionne bien!

+0

pouvez-vous partager également les résultats escomptés: comparer aussi ce lien pour en savoir plus sur la façon d'améliorer la question: https: //spaghettidba.com/ 2015/04/24/comment poser des questions à un forum public/ – TheGameiswar

Répondre

0

Vous pouvez le faire dans les deux étapes suivantes:

Étape 1: stocker le résultat dans un [Résultat]

WITH NoEndJobs AS (/* this part does not change */ 
    ... /* TL, NR */ 
) 

WITH [Result] as( /* the rest part goes to here */ 
    ... /* TL, NR */ 
) 

Étape 2: Fusionner le [Résultat] dans le [JOBLIST]:

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

Vous pouvez update the CTE itself; il vous suffit d'inclure les colonnes que vous mettez à jour:

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

Dang! J'étais si près!!! Je savais qu'il y avait un moyen d'avoir une mise à jour en utilisant JOINS. Tout ce que j'essayais avait des erreurs de syntaxe ... Cela semble être EXACTEMENT ce que j'étais après. Merci 8kb! Je vais essayer et accepter un peu. –

+0

J'ai fini par faire une petite correction qui ne montrait pas les bons résultats puisque EndBook et EndPage ont été ajoutés au CTE (NoEndJobs). Cela a résolu mon problème et m'a donné exactement ce que je voulais! - Merci! –