首页 > 解决方案 > 从 WHERE 子句中的 SELECT 中的数据更新查询字段

问题描述

我以前见过这个问题,但无法确定如何更改此查询以更新实际在 WHERE 子句中使用的 SELECT 语句中返回的字段(clientid、program、startdate 和 enddate)。如何做到这一点的任何例子都会非常有帮助。谢谢你。

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))
      );

标签: sqlsql-servertsql

解决方案


我无法对此进行测试,但我相信这就是您所追求的:

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;

请注意,您所做的是带有s 和别名的“正常”FROM子句。JOIN然后,对于您的UPDATE子句,您改为引用别名。然后,您可以使用它们各自的别名引用其他对象中的列,就像在SELECT.


推荐阅读