2017-02-08 2 views
1

이것은 내 생각에 두 개의 다른 열에 같은 레코드를 두 번 업데이트해야하지만, 작동하지 않습니다 간단한 UPDATE이어야합니다.UPDATE 두 개의 열을 기반으로 조인

단순화 된 샘플 코드 :

DECLARE @nowWithDate DATETIME = GETDATE() 
DECLARE @result TABLE(Id INT, Poll1Date DATETIME, Poll2Date DATETIME) 

INSERT INTO @result VALUES(1, NULL, NULL) 

;WITH data(Id, IsPoll1, IsPoll2) AS 
(
    SELECT 1, 1, 0 
    UNION ALL 
    SELECT 1, 0, 1 
) 
UPDATE r 
SET Poll1Date = IIF(d.IsPoll1 = 1, @nowWithDate, Poll1Date), 
    Poll2Date = IIF(d.IsPoll2 = 1, @nowWithDate, Poll2Date) 
FROM @result r 
JOIN data d ON d.Id = r.Id 

SELECT * FROM @result 

나는 그것을 알아낼 수 없습니다, 왜 두 번째 날짜가 업데이트되지? 이 행은 한 번만 업데이트됩니다.

+0

'왜 두 번째 날짜가 제공되지 않는 이유는 무엇입니까? 행을 모두 업데이트하려면'... 이것은 무엇을 의미합니까? –

+0

생각해보십시오. 'data'에 ID'@ result'와 일치하는 두 개의 행이 있습니다. 매번'@ result'의 두 열을 모두 업데이트하고 있습니다. 두 번째 행을 처리하는 것이 첫 번째 업데이트에서 업데이트 된 값을 덮어 씁니다. 업데이트 문에서 ID를 그룹화하고 'IsPoll'열에서 MAX를 사용해야하는 것처럼 들립니다. – Bridge

답변

1
DECLARE @nowWithDate DATETIME = GETDATE() 
DECLARE @result TABLE(Id INT, Poll1Date DATETIME, Poll2Date DATETIME) 

INSERT INTO @result VALUES(1, NULL, NULL) 

;WITH data(Id, IsPoll1, IsPoll2) AS 
(
    SELECT 1, 1, 0 
    UNION ALL 
    SELECT 1, 0, 1 
) 
select * from data 

2 행을 반환합니다. 따라서 @results에 가입하면 첫 번째 행에서만 업데이트됩니다. 첫 번째 행의 경우 IsPoll1 = 1이지만 IsPoll2 = 0이므로 두 번째 행은 업데이트되지 않습니다.

DECLARE @nowWithDate DATETIME = GETDATE() 
DECLARE @result TABLE(Id INT, Poll1Date DATETIME, Poll2Date DATETIME) 

INSERT INTO @result VALUES(1, NULL, NULL) 

;WITH data(Id, IsPoll1, IsPoll2) AS 
(
select Id, SUM (IsPoll1),SUM(IsPoll2) from(
    SELECT 1 as Id, 1 as IsPoll1, 0 as IsPoll2 
    UNION ALL 
    SELECT 1 as Id,0 as IsPoll1, 1 as IsPoll2) d1 
    group by d1.Id 
) 
UPDATE r 
SET Poll1Date = IIF(d.IsPoll1 = 1, @nowWithDate, Poll1Date), 
    Poll2Date = IIF(d.IsPoll2 = 1, @nowWithDate, Poll2Date) 
FROM @result r 
JOIN data d ON d.Id = r.Id 

SELECT * FROM @result 
관련 문제