2011-10-12 59 views
0

仅当状态= 'D'且没有其他记录具有相同记录时,才会使用以下数据并在状态表中填充日期时间transaction_id的状态为<>'D',如果'D'记录是选定的记录,我们也需要第一个'D'记录的日期时间。SQL - 试图在发现记录时更新字段,但只有在未发生更新时才会更新字段

DECLARE decision TABLE (
transaction_id NCHAR(1),  
event_id INT,  
status NCHAR(1) NULL, 
statud_date datetime 
) 

INSERT decision VALUES  
('1' , 1 , 'D', '2011-01-01'),  
('1' , 2 , 'D', '2011-01-01'),  
('1' , 3 , 'A', '2011-01-01'),  
('2' , 1 , 'D', '2011-05-01'),  
('2' , 2 , 'D', '2011-05-02'), 
('2' , 3 , 'D', '2011-05-03'),  
('3' , 1 , 'D', '2011-05-05'),  
('3' , 2 , 'A', '2011-05-06'),  
('3' , 3 , 'C', '2011-05-06'), 
('4' , 1 , 'D', '2011-10-01') 


DECLARE status TABLE (
transaction_id NCHAR(1),  
default_dt datetime 
) 

INSERT load VALUES  
('1' , NULL),  
('2' , NULL),  
('3' , NULL), 
('4' , NULL)  

希望得到这样的结果:

1 NULL 
2 2011-05-01 
3 NULL 
4 2011-10-01 
+0

+1的测试脚本。 Downvoters,你为什么不解释你的-1的原因? –

回答

2

如果我理解你正确TNAN你可以看看这个:

DECLARE @decision TABLE (
transaction_id NCHAR(1),  
event_id INT,  
status NCHAR(1) NULL, 
status_date datetime 
) 

INSERT @decision VALUES  
('1' , 1 , 'D', '2011-01-01'),  
('1' , 2 , 'D', '2011-01-01'),  
('1' , 3 , 'A', '2011-01-01'),  
('2' , 1 , 'D', '2011-05-01'),  
('2' , 2 , 'D', '2011-05-02'), 
('2' , 3 , 'D', '2011-05-03'),  
('3' , 1 , 'D', '2011-05-05'),  
('3' , 2 , 'A', '2011-05-06'),  
('3' , 3 , 'C', '2011-05-06'), 
('4' , 1 , 'D', '2011-10-01') 


DECLARE @status TABLE (
transaction_id NCHAR(1),  
default_dt datetime 
) 

INSERT @status VALUES  
('1' , NULL),  
('2' , NULL),  
('3' , NULL), 
('4' , NULL) 


--1st approach 
UPDATE S 
SET S.default_dt=D.status_date 
FROM @status S 
    JOIN (SELECT transaction_id,MIN(status_date) status_date, COUNT(*) cnt 
      FROM @decision 
      WHERE [status]='D' 
      GROUP BY transaction_id) D ON S.transaction_id=D.transaction_id 
WHERE S.transaction_id NOT IN (SELECT transaction_id FROM @decision WHERE [status]<>'D') 

SELECT * FROM @status  

--2nd approach 
UPDATE S 
SET S.default_dt=D.status_date 
FROM @status S 
    JOIN (SELECT transaction_id,MIN(status_date) status_date, COUNT(*) cnt 
      FROM @decision 
      WHERE [status]='D' 
      GROUP BY transaction_id) D ON S.transaction_id=D.transaction_id 
    JOIN (SELECT transaction_id, COUNT(*) cnt 
      FROM @decision 
      GROUP BY transaction_id) D2 ON S.transaction_id=D2.transaction_id AND D.cnt=D2.cnt 

SELECT * FROM @status 
+0

谢谢!我发现我的解决方案(无法正常工作)与您的第一种方法不同之处在于您如何实现where子句。这是完全合理的! –

+0

我很高兴能帮上忙。感谢您的答复。 –