SQL有条件地更新每一行
问题描述:
我遇到了复杂的情况。我搜索了所有的博客,但找不到任何接近我的期望的答案。我运行下面的查询:SQL有条件地更新每一行
**Table1 Table2**
**ID Status RptGChng RptAChng RptRChng | ID Status**
8614 Green 0 0 0 | 8614 Red
8548 Unknown 0 0 0 | 8548 Amber
2591 Amber 0 0 0 | 2591 Amber
7813 Green 0 0 0 | 7813 Green
8413 Red 0 0 0 | 8413 Red
8183 Green 0 0 0 | 8183 Green
7431 Red 0 0 0 | 7431 Red
7399 Green 0 0 0 | 7399 Red
7776 Unknown 0 0 0 | 7776 Unknown
8609 Green 0 0 0 | 8609 Green
8068 Green 0 0 0 | 8068 Green
的RptGChng应该给我1的值,如果出现了从表1至表2的id绿色值的变化。我需要以这种方式填充RptAChng - > Amber和RptRChng - > Red。 ,我写在这抵达的代码如下:
set [RptGChng] =
IIF(([Status]='Green'),1,0)-
IIF(([Status]=(
SELECT b.[Status] FROM [Table1] a INNER JOIN [Table2] b ON
a.[id]= b.[id] and b.[Status]='Green')),1,0)
答
UPDATE t1
SET t1.RptGChng = CASE WHEN t1.[Status] = 'Green' AND t1.[Status] <> t2.[Status]
THEN 1 ELSE t1.RptGChng END
,t1.RptAChng = CASE WHEN t1.[Status] = 'Amber' AND t1.[Status] <> t2.[Status]
THEN 1 ELSE t1.RptAChng END
,t1.RptRChng = CASE WHEN t1.[Status] = 'RED' AND t1.[Status] <> t2.[Status]
THEN 1 ELSE t1.RptRChng END
FROM Table1 t1
INNER JOIN Table2 t2 ON t1.[id]= t2.[id]
既然你已经使用IIF
表达我想你正在使用SQL Server 2012或更高版本,你可以写与IIF上面的说法太:
UPDATE t1
SET t1.RptGChng = IIF(t1.[Status] = 'Green' AND t1.[Status] <> t2.[Status], 1 , t1.RptGChng)
,t1.RptAChng = IIF(t1.[Status] = 'Amber' AND t1.[Status] <> t2.[Status], 1 , t1.RptAChng)
,t1.RptRChng = IIF(t1.[Status] = 'RED' AND t1.[Status] <> t2.[Status], 1 , t1.RptRChng)
FROM Table1 t1
INNER JOIN Table2 t2 ON t1.[id]= t2.[id]
我对你理解这个问题的能力印象深刻。 – 2014-12-27 18:42:24
我使用了@ M.Ali编写的第二个代码,但我得到的多部分标识符列无法绑定。我不得不做一个小小的调整,并修复它。 UPDATE t1 SET RptGChng = IIF(t1。[Status] ='Green'AND t1。[Status] t2。[Status],1,t1.RptGChng) ,RptAChng = IIF(t1。[Status] =' [Status] t2。[Status],1,t1.RptAChng) ,RptRChng = IIF(t1。[Status] ='RED'AND t1。[Status] t2。[Status] ,1,t1.RptRCngng) FROM Table1 t1 INNER JOIN Table2 t2 ON t1。[id] = t2。[id] – SKP 2014-12-28 06:06:40