Обновить поля запроса из данных в SELECT в предложении WHERE - PullRequest
0 голосов
/ 15 марта 2019

Я видел этот вопрос раньше, но не могу определить, как изменить этот запрос, чтобы иметь возможность обновлять поля (clientid, program, startdate и enddate), которые фактически возвращаются в операторе SELECT, используемом в предложении WHERE,Любой пример того, как это сделать, был бы очень полезен.Спасибо.

UPDATE baycare_homecare
SET
  IsApproved = 1
 ,ProcessDate = GETDATE()
 ,clientid = c.ClientID
 ,program = cp1.Description
 ,startdate = cp.startdate
 ,enddate = cp.enddate
WHERE
  Processdate IS NULL
  AND baycare_homecare.patient_ssn IN
      (
        SELECT
          c.socialsecuritynumber
        FROM
          carescope_live.dbo.client AS c
         ,carescope_live.dbo.client_program AS cp
        LEFT JOIN
          carescope_live.dbo.Code_Program AS cp1
            ON
            cp1.ULink = cp.ProgramULink
        WHERE
          c.ulink = cp.clientulink
          AND baycare_homecare.service_date 
            BETWEEN 
              DATEADD(ss, 1, DATEADD(d, -1, cp.startdate)) 
              AND 
              DATEADD(ss, -1, DATEADD(d, +1, cp.enddate))
      );

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

Вы могли бы сделать что-то вроде этого

UPDATE b
SET IsApproved = 1
    , ProcessDate = GETDATE()
    , clientid = a.ClientID
    , program = a.Description
    , startdate = a.startdate
    , enddate = a.enddate
FROM baycare_homecare b
JOIN (
    SELECT c.socialsecuritynumber, c.ClientID, program = cp1.Description, startdate = cp.startdate, enddate = cp.enddate
    FROM carescope_live.dbo.client AS c
    JOIN carescope_live.dbo.client_program AS cp ON c.ulink = cp.clientulink
    LEFT JOIN carescope_live.dbo.Code_Program AS cp1 ON cp1.ULink = cp.ProgramULink
    WHERE baycare_homecare.service_date BETWEEN DATEADD(ss, 1, DATEADD(d, -1, cp.startdate)) AND DATEADD(ss, -1, DATEADD(d, +1, cp.enddate))
) a ON a.socialsecuritynumber = b.patient_ssn
WHERE b.ProcessDate IS NULL

Обновлен запрос:

UPDATE b
SET IsApproved = 1
    , ProcessDate = GETDATE()
    , clientid = a.ClientID
    , program = a.Description
    , startdate = a.startdate
    , enddate = a.enddate
FROM baycare_homecare b
JOIN (
    SELECT c.socialsecuritynumber, c.ClientID, program = cp1.Description, startdate = cp.startdate, enddate = cp.enddate
    FROM carescope_live.dbo.client AS c
    JOIN carescope_live.dbo.client_program AS cp ON c.ulink = cp.clientulink
    LEFT JOIN carescope_live.dbo.Code_Program AS cp1 ON cp1.ULink = cp.ProgramULink
) a ON a.socialsecuritynumber = b.patient_ssn AND b.service_date BETWEEN DATEADD(ss, 1, DATEADD(d, -1, a.startdate)) AND DATEADD(ss, -1, DATEADD(d, +1, a.enddate))
WHERE b.ProcessDate IS NULL
0 голосов
/ 15 марта 2019

Я не могу это проверить, но я верю вот что вам нужно:

UPDATE bh
SET IsApproved=1
   ,ProcessDate = GETDATE()
   ,clientid = c.ClientID
   ,program = cp1.Description
   ,startdate = cp.startdate
   ,enddate = cp.enddate
FROM baycare_homecare bh
     JOIN carescope_live.dbo.client AS c ON bh.patient_ssn = c.socialsecuritynumber
     JOIN carescope_live.dbo.client_program AS cp ON c.ulink = cp.clientulink
                                                 AND bh.service_date BETWEEN DATEADD(ss, 1, DATEADD(d, -1, cp.startdate)) AND DATEADD(ss, -1, DATEADD(d, +1, cp.enddate)) --this isn't SARGable
     LEFT JOIN carescope_live.dbo.Code_Program AS cp1 ON cp1.ULink = cp.ProgramULink
WHERE Processdate IS NULL;

Обратите внимание, что то, что вы делаете, является "нормальным" предложением FROM,с вашими JOIN и псевдонимами.Затем для вашего предложения UPDATE вместо этого вы ссылаетесь на псевдоним.Затем вы можете ссылаться на столбцы из других объектов с их соответствующими псевдонимами, как в случае SELECT.

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