Как «объединить» результаты SQL-запроса при работе с динамическими переменными? - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь выяснить, как в основном перебрать некоторый код SQL.У меня есть набор идентификаторов JobID (только целые числа), которые извлекаются из оператора SQL, подобного этому

select jobId from tblJobs_List

, и мне нужно как-то установить их в переменную @jobId и использовать эту переменную в моем большом запросе SQL ниже(обратите внимание на конец запроса в предложении WHERE, ссылающемся на @jobId).Я понимаю, что могу использовать курсор, но когда я это делаю, получаемые наборы результатов являются отдельными.Они не "объединены".Мне нужно как-то объединить результаты.Есть идеи?

select
    a.fkJobID as 'JobID',
    d.EmailAddress, 
    d.SubscriberID,
    b.CustomObjectName as 'Data Extension Name',
    cl.EventDate as 'Last Clicked',
    op.EventDate as 'Last Opened',
    null as 'DEField1',
    null as 'DEField2',
    null as 'DEField3',
    null as 'DEField4',
    null as 'DEField5',
    null as 'DEField6',
    null as 'DEField7',
    null as 'DEField8'
from tbljobs_lists a with (nolock) 
    inner join dbo.CustomObject b with (nolock) on a.CustomObjectID = b.CustomObjectID
    inner join CXXXXXXX._Sent c with (nolock) on c.JobID = a.fkJobID
    inner join CXXXXXXX._Subscribers d with (nolock) on d.SubscriberID = c.SubscriberID
    LEFT JOIN (select Q1.* from (select cl.SubscriberID, cl.EventDate, RANK() 
        over (partition by cl.SubscriberID order by cl.EventDate desc) as 'Rank'
        FROM CXXXXXXX._Click cl) Q1 where Q1.[Rank] = 1) cl on cl.SubscriberID = d.SubscriberID
    LEFT JOIN (select Q1.* from (select op.SubscriberID, op.EventDate, RANK() 
        over (partition by op.SubscriberID order by op.EventDate desc) as 'Rank' 
        FROM CXXXXXXX._Open op) Q1 where Q1.[Rank] = 1) op on op.SubscriberID = d.SubscriberID
where a.CustomObjectID is not null and a.fkJobID = @jobid

1 Ответ

0 голосов
/ 26 апреля 2018

Лучше всего использовать JOIN, например, @Squirrel (или что-то подобное, например, IN или EXISTS), если только для этого нет веской причины.

Если вам нужно использовать цикл, сохраните идентификаторы заданий втабличная переменная со столбцом IDENTITY.Используйте столбец IDENTITY в качестве контроллера цикла.Создайте пару переменных.Сначала создайте временную таблицу и сделайте так, чтобы цикл вставлял значения перед выводом после цикла.

DECLARE @LoopNo INT
     ,@MaxLoopNo INT
     ,@JobID INT

CREATE TABLE #JobIDs (
    LoopNo INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
    JobId INT NOT NULL
)
CREATE TABLE #TempTable (
    ...
)

INSERT INTO #JobIDs
    (JobId)
SELECT JobId
FROM tblJobs_List

SET @LoopNo = 1
SET @MaxLoopNo = (SELECT MAX(LoopNo) FROM #JobIDs)

SET @JobID = (SELECT JobId FROM #JobIDs WHERE LoopNo = @LoopNo)

WHILE @LoopNo <= @MaxLoopNo
BEGIN

     INSERT INTO #TempTable
     SELECT [Your query here]

     SET @LoopNo = @LoopNo + 1
     SET @JobID = (SELECT JobId FROM #JobIDs WHERE LoopNo = @LoopNo)

END

SELECT *
FROM #TempTable

Опять же ... намного лучше и эффективнее, если вы можете JOIN, IN или использовать EXISTS.Это создаст данные за один прогон, а не один раз для каждой записи в первом наборе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...