使用同一个表修复表中的数据不正确
表位置(LocId,StartDt,EndDt)具有不正确的EndDt。 第二个表格是它应该看起来的样子。 位置表在产品Db中。 我正在使用MS SQL Server
  表位置 
  LocId StartDt EndDT 
  2015年1月1日 -  23日至2015年12月31日 
  2015年2月1日 -  15日至2015年12月31日 
  2015年3月2日 -  18日至2015年4月28日 
  2 Nov-23-2015 Dec-31-9999 
  2015年7月2日 -  23  -  2015年11月23  -  2015年 
  4月2日 -  28日至2015年12月31日 
  这就是决赛桌应该如何看待下面的情况 
  位置 
  LocId StartDt EndDT 
  2015年1月1日至23日2015年2月15日 
  2015年2月1日 -  15日至2015年12月31日 
  2015年3月2日 -  18日至2015年4月28日 
  4月2日 -  2015年7月23日 -  2015年7月 
  2015年7月2日 -  23  -  2015年11月23  -  2015年 
  2 Nov-23-2015 Dec-31-9999 
我应该如何编写一个select查询,以便根据第一个表格使用第一个表格获得结果。
我应该执行哪些步骤以及更新查询将如何更正位置表中的数据。
  我认为你想要lead() : 
select l.*,
       (case when enddt = '9999-12-31'
             then lead(startdt) over (partition by locid order by startdt)
             else enddt
        end) as new_enddt
from location l;
您可以使用CTE将其并入更新中:
with toupdate as (
      select l.*,
             (case when enddt = '9999-12-31'
                   then lead(startdt) over (partition by locid order by startdt)
                   else enddt
              end) as new_enddt
      from location l
     )
update toupdate
    set enddt = new_enddt
    where enddt <> new_enddt;
我会使用LEAD函数(需要SQL2012 +):
DECLARE @TargetTable TABLE (
    ID      INT IDENTITY(1, 1) PRIMARY KEY,
    LocId   INT  NULL,
    StartDt DATE NULL,
    EndDt   DATE NULL
)
INSERT  @TargetTable (LocId, StartDt, EndDt)
SELECT  s.LocId, TRY_PARSE(s.StartDt AS DATE), TRY_PARSE(s.EndDT AS DATE)
FROM (VALUES    
    (1, 'Jan-23-2015', 'Dec-31-9999'),
    (1, 'Feb-15-2015', 'Dec-31-9999'),
    (2, 'Mar-18-2015', 'Apr-28-2015'),
    (2, 'Nov-23-2015', 'Dec-31-9999'),
    (2, 'Jul-23-2015', 'Nov-23-2015'),
    (2, 'Apr-28-2015', 'Dec-31-9999')
) s(LocId, StartDt, EndDT);
WITH CteUpdate
AS (
    SELECT  t.EndDt, ISNULL(LEAD(t.StartDt) OVER(PARTITION BY t.LocId ORDER BY t.StartDt), '9999-12-31') AS NewEndDt
    FROM    @TargetTable t
) 
UPDATE  CteUpdate
SET     EndDt = NewEndDt;
SELECT * FROM @TargetTable ORDER BY LocId, StartDt
结果:
ID          LocId       StartDt    EndDt
----------- ----------- ---------- ----------
1           1           2015-01-23 2015-02-15
2           1           2015-02-15 9999-12-31
3           2           2015-03-18 2015-04-28
6           2           2015-04-28 2015-07-23
5           2           2015-07-23 2015-11-23
4           2           2015-11-23 9999-12-31
你想要的更新语句看起来像这样:
UPDATE
    Tab1
SET
    Tab1.[StartDT] = Tab2.[StartDT],
    Tab1.[EndDT] = Tab2.[EndDT]
FROM
    [Location] Tab1
    JOIN [Location] Tab2
        ON Tab1.[LocId] = Tab2.[Loc2]
然后,您可以对SELECT语句使用相同的联接。
链接地址: http://www.djcxy.com/p/65615.html