代码之家  ›  专栏  ›  技术社区  ›  Camus

用不带Where子句的Select Inner Join更新表

  •  0
  • Camus  · 技术社区  · 6 年前

    我正在尝试用联接中的值更新表。但是,运行此命令会更新0行。当用select替换update语句时,我得到1行连接。

    下面是我在工作中努力实现的目标。获取与下一个策略相关的子策略ID$金额(它们不相关,取决于日期)。它们通过rgnID)链接并更新临时表。我修改了下面的只是为了模拟。

    create table tTB1 (plcyID int, rgnID int, ncptdt datetime, plctypID int)
    
    insert into tTB1 (plcyID , rgnID , ncptdt , plctypID)
    values (1,1,'2017-10-01',1),(2,1,'2018-10-01',2),
    (3,1,'2018-10-01',3),(4,1,'2019-10-01',2)
    
    --create table #tTEMP (total int, plcyID int, rgnID int, ncptdt datetime, plctypID int)
    --select * from tTB1
    ;WITH cteLYPolicy
    AS
    (
    select p.rgnID,MXPLCY=MAX(p.plcyID)
      FROM tTB1 t
      INNER JOIN tTB1 p ON p.rgnID=t.rgnID and p.ncptdt<t.ncptdt and p.plcyID<t.plcyID and p.plctypID in (1,2)
      WHERE t.plctypID=2
      GROUP BY p.rgnID
    )
    --UPDATE l
    --set l.plctypID = 10--p.plctypID
    select * 
    from cteLYPolicy cte
    inner join tTB1 l ON l.plcyID =cte.MXPLCY --ly
    inner join tTB1 p ON p.rgnID=l.rgnID and p.ncptdt>l.ncptdt and p.ncptdt = DATEADD(year,1,l.ncptdt)
    
    
    0 回复  |  直到 6 年前
        1
  •  1
  •   pim    6 年前

    如果列的值已经是您试图设置的值,那么SQL Server和大多数RDM都将以这种方式运行。

    http://sqlfiddle.com/#!18/8eb54/7

    CREATE TABLE [t] (
      PRIMARY KEY ([n])
      , [n] INT NOT NULL
    );
    
    INSERT INTO [t] ([n])
    SELECT 1;
    -- 0 Rows affected 
    
    UPDATE [t]
    SET [n] = 1
    WHERE 1 = 1;
    -- 0 Rows affected 
    
    SELECT * FROM [t];
    -- 1 Row returned