从无位置子句的选择内部联接更新表

时间:2019-10-20 08:27:22

标签: sql sql-server

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

以下只是我在工作中要实现的目标。获取与下一个策略相关的子策略ID $ amount(它们不相关,并且取决于日期。它们通过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)

1 个答案:

答案 0 :(得分:1)

如果列的值已经是您要设置的值,则SQL Server和大多数RDMS都会以这种方式运行。

此行为的演示: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