仅更新具有共享/类似值的行

时间:2014-07-15 22:12:39

标签: sql-server sql

好的 - 我有一个简单的表 - 下面 - 我要做的是只识别那些具有共享值的行 - 所以任何有共享" apc"值 - DO x else Do Y

CREATE TABLE #test (hcpcs varchar(10), apc varchar(100), rate money) 

INSERT INTO #test (hcpcs, apc)
SELECT '97110', '8009'
UNION ALL
SELECT '71020', '8009'
UNION ALL
SELECT '85025', '8006'

所以 - 从上面 - 所有那些共享" 8009" - 我会将这些行格式化以进行更新 - 它们将共享相同的" rate"。用" 8006"行将不会成为该更新的一部分

3 个答案:

答案 0 :(得分:0)

你想:

WHERE EXISTS (SELECT *
     FROM #test t2
     WHERE t2.apc = #test.apc
     AND t2.hcpcs != #test.hcpcs)

确保将apc编入索引,以便有效地完成此操作。

答案 1 :(得分:0)

IMO获得所有预期结果的最舒适方式是使用SQL-Server的OVER Klause。

select *, count(*) over (partition by apc) as CNT
from #test order by CNT desc

将返回所有行以及重复信息(仅使用order子句,因此您可以很容易地使用它)。

要将此更改为更新,我将使用CTE:

with T1 as (select hcpcs, count(*) over (partition by apc) as CNT
    from #test)
update #test
set rate=@newrate
from #test inner join t1 on #test.hcpcs=T1.hcpcs
where CNT > 1

(请注意,order by子句必须消失 - 它在CTE中是不允许的,无论如何都无用:))

答案 2 :(得分:0)

只需将任何内容更改为CASE表达式即可。您可以使用OUTPUT子句检查它的作用,然后在实际查询中将其删除。

UPDATE T 
SET rate = CASE WHEN SRC.CNT > 1 THEN rate*5.00 ELSE rate*2.00 END
OUTPUT inserted.apc, deleted.rate old_rate, inserted.rate NEW_rate -- This is just to show results for testing
FROM #test T
JOIN (SELECT apc, COUNT(*) CNT
     FROM #test
     GROUP BY apc) SRC ON SRC.apc = T.apc