在CTE中运行多个SET语句?

时间:2017-03-06 15:10:09

标签: sql sql-server-2012

使用SQL 2012

我有一份CTE声明给我错误的结果。每个record_id的多个记录可能存在不同的类型。这似乎是跳过记录而不是正确更新所有记录:

WITH cte as (
    SELECT
        o.sname, o.type, o.record_id, 
        p.data1, p.data2, p.data3

    FROM
        table1 p
        JOIN table2 o ON o.record_id = p.record_id
    WHERE
        o.record_id IN(1,2,3)
        --AND (o.type = 123 or o.type = 456 or o.type = 789)       

UPDATE cte
set data1 = (case when type = 123 then 1 else data1 end),
data2 = (case when type = 456 then 1 else data2 end),
data3 = (case when type = 378 then 1 else data3 end)
where type in (123,456,789) 

不确定为什么会这样。

我所追求的只是查看某些记录,如果存在特定的TYPE值,每次遇到特定类型时都将DATA值更改为1.

如果我以这种方式运行CTE的UPDATE部分,它可以正常工作,而不是在一起时:

UPDATE cte
    set data1 = (case when type = 123 then 1 else data1 end),
    where type in (123) 

UPDATE cte
    set data2 = (case when type = 456 then 1 else data2 end)
    where type in (456)

UPDATE cte
    set data3 = (case when type = 789 then 1 else data3 end)
    where type in (789)

什么错了?

以下是表格和期望的输出:

TABLE1      
record_id   |type   |sname
------------|-------|-----|
1           |123    |alpha
2           |123    |alpha
2           |456    |beta
3           |456    |beta
3           |789    |gamma

表2最初都是零

Desired Output:         
TABLE2          
record_id|  data1|  data2|  data3|
---------|-------|-------|-------|
1        |1      |   0   |   0
2        |1      |   1   |   0
3        |0      |   1   |   1

实际输出:

TABLE2          
record_id|  data1|  data2|  data3|
---------|-------|-------|-------|
1        |1      |   0   |   0
2        |1      |   0   |   0
3        |0      |   1   |   0

谢谢,

MP

1 个答案:

答案 0 :(得分:2)

您可以简单地在子查询中使用聚合来检查给定record_id存在哪种类型,然后像这样进行多表更新:

Number

Demo

另一种方法是使用update t2 set t2.data1 = t1.data1, t2.data2 = t1.data2, t2.data3 = t1.data3 from table2 t2 join ( select record_id, max(case when type = 123 then 1 else 0 end) as data1, max(case when type = 456 then 1 else 0 end) as data2, max(case when type = 789 then 1 else 0 end) as data3 from table1 group by record_id ) t1 on t1.record_id = t2.record_id; 的相关性:

EXISTS

Demo 2

相关问题